【问题标题】:CAShapeLayer is not drawn in simulator in iPad retina mode在 iPad 视网膜模式下,CAShapeLayer 未在模拟器中绘制
【发布时间】:2012-06-05 18:53:18
【问题描述】:

我有一小段代码,它画了一个圆圈作为 CAShapeLayer:

- (void) viewWillAppear:(BOOL)animated {
    CGFloat size = MIN(self.view.frame.size.width, self.view.frame.size.height);
    CAShapeLayer *circleLayer = [CAShapeLayer layer];
    circleLayer.fillColor = [[UIColor redColor] CGColor];
    circleLayer.frame = CGRectMake((self.view.frame.size.width - size) / 2.0 ,(self.view.frame.size.height - size) / 2.0, size, size);
    CGMutablePathRef pathRef = CGPathCreateMutable();
    CGPathAddEllipseInRect(pathRef, NULL, CGRectMake(0, 0, size, size));
    circleLayer.path = pathRef;
    CGPathRelease(pathRef);

    [self.view.layer addSublayer:circleLayer];
}

圆圈在 iPad 2 和非视网膜模式下的模拟器中正确显示。当我将模拟器切换到视网膜模式时,根本不显示圆圈。不幸的是,我还没有真正的 iPad 3,所以我不能说它是否可以在实际设备上运行。 谁能解释一下,我做错了什么?

更新:我将此作为错误报告给 Apple。他们告诉我,这个错误是重复的,另一个错误仍然是开放的。一段时间后它关闭了,但在最后一次 XCode 更新后它仍然可以重现

更新 2:在真正的 iPad 3 上进行了检查。工作正常。

【问题讨论】:

  • 我已经转载了这个。很奇怪。
  • 您的代码很好,它适用于除 iPad Retina 之外的所有模拟器(iPad 和 iPhone)。我也没有 iPad 3,所以无法在设备上进行测试,但这看起来像是一个模拟器错误。我确实有一个具有更复杂形状层的应用程序,并且它确实适用于 iPad 视网膜模拟器,所以它是一个奇怪的应用程序。你应该把它报告给苹果,因为它很容易重现。
  • 谢谢。我会试着找一个有 iPad 3 的人。
  • 我也在模拟器上尝试这样的事情。显然,如果我使形状更小,它会被绘制...如果只是模拟器的问题,有什么更新吗?
  • 如果您可以为此创建一个开放雷达错误条目,那就太棒了。

标签: ios ios5 ios-simulator retina-display cashapelayer


【解决方案1】:

确实!使用您的代码,如果circleLayersize 为512 或更高,则圆圈不会在模拟器的视网膜iPad 上显示...

现在,鉴于我希望今晚能够安然入睡,这里有一个使用 CALayer 的 cornerRadius 属性来解决问题的解决方法:

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated]; //always call super

    CGFloat size = MIN(self.view.frame.size.width, self.view.frame.size.height);
    NSLog(@"size: %f", size);

    CALayer *circleLayer = [CALayer layer];
    [circleLayer setBackgroundColor:[UIColor redColor].CGColor];
    circleLayer.frame = CGRectMake((self.view.frame.size.width - size) / 2.0 ,(self.view.frame.size.height - size) / 2.0, size, size);

    circleLayer.cornerRadius = size/2;

    [self.view.layer addSublayer:circleLayer];
}

这也会在 iPad 视网膜模拟器中显示相同的圆圈。

【讨论】:

  • 你也可以使用 CGFloat scale = [[UIScreen mainScreen] scale];比如:whiteMaskLayer.frame = CGRectMake(0, 0, imgView.bounds.size.width * scale, imgView.bounds.size.height * scale)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多