【问题标题】:NaN ERROR iOS (NSUInteger vs. CGFloat)NaN 错误 iOS(NSUInteger 与 CGFloat)
【发布时间】:2015-10-06 19:24:02
【问题描述】:

我从一个有信誉的教程中提取了这段代码,当我运行应用程序时,我在 CGFloat 实例 *imageHeight 上得到一个 NaN 错误。但是,如果我将类型更改为 NSUInteger,则应用程序构建得很好。有没有人可以解释发生了什么。我理解 NaN = Not A Number,但 CGFloat 作为数据类型应该可以正常工作。

崩溃

CGFloat imageHeight = self.mediaItem.image.size.height / self.mediaItem.image.size.width * CGRectGetWidth(self.contentView.bounds);
self.mediaImageView.frame = CGRectMake(0, 0, CGRectGetWidth(self.contentView.bounds), imageHeight);<--NaN ERROR is thrown here

不会崩溃

NSUInteger imageHeight = self.mediaItem.image.size.height / self.mediaItem.image.size.width * CGRectGetWidth(self.contentView.bounds);
self.mediaImageView.frame = CGRectMake(0, 0, CGRectGetWidth(self.contentView.bounds), imageHeight);

完整的方法体

- (void) layoutSubviews {
    [super layoutSubviews];

    NSUInteger imageHeight = self.mediaItem.image.size.height / self.mediaItem.image.size.width * CGRectGetWidth(self.contentView.bounds);
    self.mediaImageView.frame = CGRectMake(0, 0, CGRectGetWidth(self.contentView.bounds), imageHeight);

    CGSize sizeOfUsernameAndCaptionLabel = [self sizeOfString:self.usernameAndCaptionLabel.attributedText];
    self.usernameAndCaptionLabel.frame = CGRectMake(0, CGRectGetMaxY(self.mediaImageView.frame), CGRectGetWidth(self.contentView.bounds), sizeOfUsernameAndCaptionLabel.height);

    CGSize sizeOfCommentLabel = [self sizeOfString:self.commentLabel.attributedText];
    self.commentLabel.frame = CGRectMake(0, CGRectGetMaxY(self.usernameAndCaptionLabel.frame), CGRectGetWidth(self.bounds), sizeOfCommentLabel.height);

    // Hide the line between cells
    self.separatorInset = UIEdgeInsetsMake(0, CGRectGetWidth(self.bounds)/2.0, 0, CGRectGetWidth(self.bounds)/2.0);
}

【问题讨论】:

  • 您可以发布self.mediaItem.image.size.heightself.mediaItem.image.size.widthCGRectGetWidth(self.contentView.bounds) 的值吗? :)
  • @sloik 值会根据传入的图像大小而变化。每个单元格的每个 contentView 可能不同,也可能不同。换句话说,我真的不知道。
  • 我用完整的方法主体和定义更新了问题。
  • 为什么 CGFloat 能够处理 NaN?
  • 但是你遇到了崩溃,对吧?那么当你发生崩溃时的价值是什么? :)

标签: ios objective-c compiler-errors nan


【解决方案1】:

获得 NaN 的唯一可能方法是计算 0 / 0,因此我推断 self.mediaItem.image.sizeheightwidth 成员可能都为零。也就是说,self.mediaImage.image.size 可能是CGSizeZero

请注意,如果self.mediaItem 为零,或者self.mediaItem.image 为零,则self.mediaItem.image.size 返回CGSizeZero。我的猜测是其中之一是零。

您可以轻松地检查这一点。要么在layoutSubviews 中设置断点,要么在其顶部添加NSLog

NSLog(@"layoutSubviews: mediaItem=%p image=%p size=%@",
    self.mediaItem, self.mediaItem.image,
    NSStringFromCGSize(self.mediaItem.image.size));

【讨论】:

  • 感谢您的帮助!
  • 根据您的建议,检查 (self.mediaItem != nil) 是否也可以处理使用类型 CGFloat 时的问题。
  • 使用NSUInteger 时没有出错的原因是因为将CGFloat NaN 转换为整数会得到零。
猜你喜欢
  • 1970-01-01
  • 2014-03-17
  • 2011-11-10
  • 2014-02-13
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多