【问题标题】:CATextLayer not scrollingCATextLayer 不滚动
【发布时间】:2011-12-22 03:44:12
【问题描述】:

我目前正在编写一个读取文件并将标题放入列表的应用程序。当单击每个标题时,它会切换到一个带有 CATextLayer 的控制器,其中包含与该标题相关联的文本(通常是几个段落)。最初,我使用 UITextView,但我发现我需要更多格式选项(即对齐对齐)并切换到 CATextLayer。

我在这里的其他问题中读到 CATextLayer 天生就是可滚动的,但是我找不到如何触发该行为。当我尝试设置contentsRect 时,我的文字完全从视图中消失了。

这是我的设置代码,除了滚动之外还可以使用:

    CATextLayer *textLayer = [[CATextLayer alloc] init];
    textLayer.alignmentMode = kCAAlignmentJustified;
    textLayer.string = [_data objectForKey:@"Text"];
    textLayer.wrapped = YES;
    textLayer.frame = CGRectMake(27, 75, 267, 320);
    textLayer.font = [UIFont fontWithName:@"Helvetica" size:17.0f];
    textLayer.foregroundColor = [UIColor blackColor].CGColor;
    textLayer.backgroundColor = [UIColor whiteColor].CGColor;
    [textLayer setCornerRadius:8.0f];
    [textLayer setMasksToBounds:YES]; 
    [textLayer setBorderWidth:1.0f];
    [textLayer setBorderColor:[UIColor grayColor].CGColor];
    [self.view.layer addSublayer:textLayer];
    [textLayer release];

我查看了 CATextLayer 和许多其他 SO 问题的文档,但没有找到我想要的。

编辑: 可以滚动此类,但需要使用contentsRect 的偏移量以编程方式进行。对于一些辅助函数(scrollToPointscrollToRect)和稍微整洁的计算集,它可以被子分层到 CAScrollLayerCAScrollLayer 也需要程序员处理触摸事件,所以为了简单起见,我就不走这条路线了。

对于那些想通过CAScrollLayer 走这条路线的人,我的设置代码更改为以下:

    CAScrollLayer  *scrollLayer = [[CAScrollLayer alloc] init];
    scrollLayer.frame = CGRectMake(27, 75, 267, 320);
    scrollLayer.backgroundColor = [UIColor whiteColor].CGColor;
    scrollLayer.scrollMode = kCAScrollVertically;    
    [scrollLayer setCornerRadius:8.0f];
    [scrollLayer setMasksToBounds:YES]; 
    [scrollLayer setBorderWidth:1.0f];
    [scrollLayer setBorderColor:[UIColor grayColor].CGColor];
    scrollLayer.contentsRect = CGRectMake(0, 0, 250, 350);
    scrollLayer.contentsGravity = kCAGravityCenter;

    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) 
    { 
        scrollLayer.contentsScale = [[UIScreen mainScreen] scale];
    }

    CATextLayer *textLayer = [[CATextLayer alloc] init];
    textLayer.alignmentMode = kCAAlignmentJustified;
    textLayer.string = [_notice objectForKey:@"Text"];
    textLayer.wrapped = YES;
    textLayer.frame = CGRectMake(5, 5, 250, 500);
    textLayer.font = [UIFont fontWithName:@"Helvetica" size:17.0f];
    textLayer.foregroundColor = [UIColor blackColor].CGColor;
    textLayer.backgroundColor = [UIColor whiteColor].CGColor;

    [scrollLayer addSublayer:textLayer];

    [self.view.layer addSublayer:scrollLayer];
    [scrollLayer release];
    [textLayer release];

【问题讨论】:

    标签: iphone catextlayer


    【解决方案1】:

    你是如何使用 contentsRect 的?它是一个单位矩形坐标,即每个参数都介于零和一(含)之间。

    所以如果你想在点 30, 30 显示 50 x 50 的子矩形,你会这样做

    textLayer.contentsRect = CGRectMake(30.0f / CONTENT_WIDTH, 30.0f / CONTENT_HEIGHT, 267.0f / CONTENT_WIDTH, 320.0f / CONTENT_HEIGHT);
    

    其中 CONTENT_WIDTH 和 CONTENT_HEIGHT 是内容的大小。

    【讨论】:

    • 我花了一些时间根据您的公式处理值,不幸的是,我得到的只是模糊的文本,这些文本向上和向左偏移并在边缘拉伸。不管我输入了什么,我仍然没有得到任何滚动。还有什么进一步的见解吗?
    • 尝试设置 layer.contentGravity = kCAGravityCenter 并确保你有 if ([[UIScreen mainsScreen] respondsToSelector:@selector(scale)] { layer.contentsScale = [[UIScreen mainScreen] scale];}
    • 在特定值内,修复模糊和拉伸,但文字在两侧被截断,仍然没有滚动。
    • 侧面被切掉的单词听起来好像无法将内容宽度放入提供的图层框架中。 (例如,您尝试在 180 宽的视图框架中显示 200 像素宽的文本)。至于滚动,我对您的期望感到困惑。 CALayer 不提供任何处理触摸输入的功能。您必须在调整 contentRect 时手动收听和处理触摸事件。
    • 在另一篇 SO 帖子中,有人说 CALayer 和 CATextLayer 都可以滚动,并且基于接受的答案,我认为这是我忽略的更简单的东西。那么,作为我自己的参考,我会通过触摸事件的偏移量来调整前面示例中的 30.0f 以给出滚动的外观?我会更适合走另一条路吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多