【问题标题】:Why does this drawing code work on some iPads running iOS 8.1, but not others?为什么此绘图代码在运行 iOS 8.1 的某些 iPad 上有效,而在其他 iPad 上无效?
【发布时间】:2014-12-04 02:14:32
【问题描述】:

我遇到了一个奇怪的问题,我的代码适用于某些 iPad 型号,但不适用于其他型号,即使它们运行的​​是相同版本的 iOS。这个绘制白色圆圈的简单代码适用于运行 iOS 8.1.1 的 iPad 4,但不适用于运行 8.1.1 的 iPad Mini Retina。这甚至可以在模拟器中重现。它在“iPad Retina 8.1”或“iPad 2 8.1”模拟器上运行时有效,但在“iPad Air 8.1”上运行时无效。当它不起作用时,它不会画一个小白圈。视图是空白的。为什么会这样?

@implementation MyUIViewSubclass
{
    CAShapeLayer* animationLayer;
    CGMutablePathRef smallCircle;
}

- (id) initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCoder:aDecoder])
    {
        smallCircle = CGPathCreateMutable();
        CGPathAddArc(smallCircle, NULL, self.bounds.size.width / 2, self.bounds.size.height / 2, 32, (CGFloat)M_PI, -(CGFloat)M_PI, NO);

        animationLayer = [CAShapeLayer layer];
        animationLayer.frame = CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height);
        animationLayer.lineWidth = 1;
        animationLayer.strokeColor = [[UIColor whiteColor] CGColor];
        animationLayer.fillColor = [[UIColor clearColor] CGColor];
        animationLayer.path = smallCircle;

        [self.layer addSublayer:animationLayer];
    }
    return self;
}

@end

【问题讨论】:

  • 是的,CGFloat(以及其他一些 Apple 包装器原语)最终可能会出现与您预期不同的类型。例如,CGFloat 可能是您期望的浮点数,也可能是双精度数,具体取决于架构。此外,将 UI 代码放在 init 方法中被认为是不好的做法。您通常希望它们出现在 viewDidLoad 或 viewWillAppear 中,具体取决于您的设置。

标签: ios objective-c ipad core-graphics


【解决方案1】:

在我写这个问题的时候发现了这一点。它不适用于 64 位设备。当我将 CGFloat 更改为浮动时,它起作用了。 CGFloat 在 32 位和 64 位平台上的定义不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-21
    • 2022-10-07
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    相关资源
    最近更新 更多