【问题标题】:CALayer not drawing within bounds of custom UIViewCALayer 不在自定义 UIView 的范围内绘制
【发布时间】:2012-06-01 04:14:23
【问题描述】:

我创建了一个自定义 UIView,我最终将拥有 10 个用户可以点击的区域。当一个区域被点击时,我想覆盖一个低 alpha 层来指示他们的选择。

不幸的是,当我点击一个部分时,我创建的 CALayer 正在我的自定义视图范围之外绘制。好像我的 x 和 y 坐标都关闭了。

这是我的自定义视图中的 drawRect 方法:

- (void)drawRect:(CGRect)dirtyRect
{
    if (touchPoint.x > 0 || touchPoint.y > 0){
        CGRect bounds = [self bounds];

        float widthOfArea = bounds.size.width / 10.0;

        float sectionNumber = round(touchPoint.x / widthOfArea);

        touchOverlayLayer = [[CALayer alloc] init];

        [touchOverlayLayer setBounds:CGRectMake(0.0, 0.0, widthOfArea, bounds.size.height)];

        [touchOverlayLayer setPosition:CGPointMake(widthOfArea * sectionNumber, self.bounds.origin.y)];

        UIColor *greyish = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:.5];

        CGColorRef cggreyish = [greyish CGColor];

        [touchOverlayLayer setBackgroundColor:cggreyish];

        [[self layer] addSublayer:touchOverlayLayer];
    }
}

结果显示已附加。

【问题讨论】:

  • 我应该补充一下,我可以通过创建一个 100x100 矩形和 setPostion:CGPointMake(0.0, 0.0) 来简化它,我得到非常相似的结果。

标签: objective-c uiview calayer


【解决方案1】:

setPosition 将图层的锚点放在该位置。图层的默认锚点是中心。这与您所看到的非常吻合。

您可以将锚点设置为0,0然后设置位置,您应该没问题。

这里简单解释一下锚点等。

这有点棘手。框架、边界和位置都绑定在一起。在您的情况下,您只需设置图层的框架就可以了,当您要旋转或以其他方式变换图层时,锚点更常用 - 它成为变换的原点。如果您更改锚点,它会移动图层,但是您正在设置位置,因此它会再次将其移回。文档在这方面有点弱,但网上有很多例子。

锚点成为一切发生的位置。因此,如果您设置位置,图层会移动,使其锚点位于该位置。如果旋转图层,它会围绕锚点旋转,等等。

【讨论】:

  • 这立即解决了我的问题。谢谢一堆。只是为了让我理解,我有点不清楚 anchorPoint 属性代表什么。我意识到我正在子图层上设置锚点,但是如何移动图层在其父图层中的位置?我的假设是我需要修改父视图上的一些属性......我已经阅读了 Apple 文档,但我认为我遗漏了一些东西。
  • 这有点棘手。框架、边界和位置都绑定在一起。在您的情况下,您只需设置图层的框架就可以了,当您要旋转或以其他方式变换图层时,锚点更常用 - 它成为变换的原点。如果您更改锚点,它会移动图层,但是您正在设置位置,因此它会再次将其移回。文档在这方面有点弱,但网络上有很多例子。
  • 我实际上并没有回答你的问题。锚点成为一切发生的位置。因此,如果您设置位置,图层会移动,使其锚点位于该位置。如果旋转图层,它会围绕锚点旋转,等等。
  • 感谢您的回复。我想我还有一些阅读要做,但我理解得足够好,可以解决我眼前的问题。
【解决方案2】:

只添加这一行

touchOverlayLayer.anchorPoint=CGPointMake(0, 0);

默认的anchorPoint是0.5,0.5表示在图层的中心。

【讨论】:

    猜你喜欢
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多