【问题标题】:CALayer redraw on rotationCALayer 在旋转时重绘
【发布时间】:2012-01-05 04:10:03
【问题描述】:

我的 CALayer 绘图代码中有这个

- (void) drawInContext:(CGContextRef)ctx {
self.frame = self.superlayer.bounds;

CGFloat height = self.bounds.size.height;
CGFloat width = self.bounds.size.width;

CGContextSetFillColorWithColor(ctx, [UIColor grayColor].CGColor);

//Draw a stripe every other pixel
int count = 0; 
while (count < height) {   
    CGContextFillRect(ctx, CGRectMake(0, count, width, 1));
    count=count+2;
}

}

基本上,它的绘图针条纹在视图顶部。我想让它填满视图。

视图固定在 40 高和 iPad 的宽度。

当我旋转时,我告诉 CALayer 重绘(这是另一个问题 - 我宁愿它自动缩放到新的宽度)。

即使是上面宽度和高度的日志输出,它也是正确的。但是当它在横向上绘制时 - 右侧有大约 100 像素的间隙......

有什么想法或更好的方法吗?

【问题讨论】:

  • 有趣的是,如果我从纵向开始它很好,我旋转到横向并且很好,然后我再次旋转到纵向 - 它会改变!

标签: objective-c ios ipad calayer


【解决方案1】:
-(void)layoutSublayersOfLayer:(CALayer *)layer{
CGFloat ht = self.frame.size.height/2 - 55/2;
arrowImage.frame = CGRectMake(self.frame.size.width-30, ht, 30.0f, 55.0f);
}

arrowImage is a CALayer

这对我来说非常有效。

【讨论】:

    【解决方案2】:

    您需要覆盖父层中的 layoutSublayers。或父视图中的 layoutSubviews(告诉它在其中任何一种方法中重绘)。

    【讨论】:

    • 好吧,我告诉它重绘没有任何问题,因为我在 didRotateToInterface 上的图层上调用了 [myLayer setNeedsDisplay] ...它只是无法正确重绘 - 即使我的日志输出说框架/边界大小是我所期望的。
    【解决方案3】:

    真是浪费我的时间......我放弃了,并以不同的方式做到了。

    另外.....Core Animation Programming Guide 对我撒谎并告诉我 CALayer 有一个 autoResizingMask——它可能会为我解决这个问题。它没有这个属性,反正iOS版上也没有……MacOS版可能有。

    我放弃在 CALayer 中执行此操作,并在 UIView 上的 drawRect 中执行相同的操作,并设置我的 UIView 的 autoResizingMask。

    这样就解决了。虽然不知何故我觉得我应该在 CALayer 中这样做......?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      相关资源
      最近更新 更多