【问题标题】:What could be causing this "Fatal Exception: CALayerInvalidGeometry CALayer bounds contains NaN: [nan nan; nan nan]" crash?什么可能导致此“致命异常:CALayerInvalidGeometry CALayer bounds contains NaN: [nan nan; nan nan]”崩溃?
【发布时间】:2015-02-15 23:01:08
【问题描述】:

我有以下代码,它只是简单地初始化 UIImageView 以适应 UIImage 在当前屏幕尺寸上尽可能大:

CGSize mainScreenSize = [appDelegate mainScreenSize];
CGSize superViewSize = CGSizeMake(mainScreenSize.width, mainScreenSize.height);
CGSize size = [self.image size];

CGFloat xScale = superViewSize.width / size.width;
CGFloat yScale = superViewSize.height / size.height;

CGFloat minimumScale = MIN(xScale, yScale);
self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, size.width * minimumScale, size.height * minimumScale)];

self.imageView.image = self.image;
self.frame = CGRectMake(0, 0, size.width * minimumScale, size.height * minimumScale);

[self addSubview:self.imageView];

由于某种原因,当我的一些用户使用该应用程序时,正在设置UIImageViewframe 的部分代码导致以下崩溃:

Fatal Exception: CALayerInvalidGeometry CALayer bounds contains NaN: [nan nan; nan nan]

在检查我的崩溃日志时,该错误似乎在所有 iOS 版本、设备和方向上都是一致的,因此我已经排除了这种可能性。作为旁注,我用这样的方式来实现上面的代码:

self.imageView = [[UIImageView alloc] initWithImage:image];
self.frame = CGRectMake(0, 0, self.imageSize.width, self.imageSize.height);
[self addSubview:self.imageView];

然后在它附加到超级视图之后,我将对 UIImageView 执行转换以调整它的大小,但我从未收到上述错误(由于解决另一个框架引起的错误,我不得不更改为新方法)。

我知道上述错误通常是由除以 0 或将框架宽度和高度设置为 0 引起的,但我很难弄清楚这是怎么发生的。我不认为问题出在 imageSize 上,因为正如我之前所说,我在以前的方法中从来没有遇到过这个问题。至于 mainScreen 大小,这是我的应用程序委托中的方法:

- (CGSize) mainScreenSize
{
    CGSize mainScreenSize = [[UIScreen mainScreen] bounds].size;

    if ([OperatingSystemVersion operatingSystemVersionLessThan:@"8.0"] && UIDeviceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]))
    {
        mainScreenSize = CGSizeMake(mainScreenSize.height, mainScreenSize.width);
    }

    return mainScreenSize;
}

有人知道是什么原因造成的吗?

实际上意识到我在.h中设置了我的图像属性:

@interface DynamicImageView : UIView <UIGestureRecognizerDelegate>
{
    UIImage *_image;
}
@property(nonatomic, strong) UIImage *image;

但我没有在我的 .m 文件中合成它。这会导致问题吗?我想知道这在大多数情况下是如何工作的,只是有时会崩溃?

【问题讨论】:

  • 您的错误是由您输入的无效数字引起的(NaN -“非数字”)。我想当您尝试创建框架时,您的某些对象是nil。通过日志和断点检查。
  • @croX 但是当我使用旧方法时,它从来没有崩溃过。我不认为 UIImage 是零。
  • @croX 也许你是对的,我编辑了我的帖子来展示我是如何初始化我的 self.image 属性的,但我忘记了合成它。我想知道它是如何工作的,或者为什么只是有时它会导致它崩溃。
  • 可能不一定是图片。这也可能是您的 [appDelegate mainScreenSize] 方法中的错误。我不知道你的代码,但你肯定在某处有一个无效的对象,这会导致你的帧计算产生一个无效的(NaN)数字:)
  • 编译器会自动合成你的属性。所以这不应该是错误

标签: ios iphone cocoa-touch uiview


【解决方案1】:

原因是当用户从他们的照片库中加载照片时,如果没有足够的内存来加载照片,那么nil 将返回UIImage。所以我上面的代码试图根据nil UIImage 的大小创建一个UIImageViewframe,从而导致它崩溃。我通过处理从我的UIImagePickerController 返回nil UIImage 的情况来解决此问题。

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2013-03-29
    相关资源
    最近更新 更多