我从一个声誉良好的教程中提取了这段代码,当我运行应用程序时,我在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);
}
答案 0 :(得分:5)
你可以通过计算0 / 0
获得NaN的唯一可能方式,因此我推断height
的{{1}}和width
成员可能都为零。也就是说,self.mediaItem.image.size
可能是self.mediaImage.image.size
。
请注意,如果CGSizeZero
为零,或者self.mediaItem
为零,则self.mediaItem.image
会返回self.mediaItem.image.size
。我的猜测是其中一个是零。
您可以轻松查看此内容。在CGSizeZero
中添加断点,或在其顶部添加layoutSubviews
:
NSLog