я следующий фрагмент кода, который просто инициализирует UIImageView
, чтобы соответствовать UIImage
пропорционально для такого размера, как это возможно, может быть на текущем размере экрана:Что может быть причиной этого «Неустранимого исключения: CALayerInvalidGeometry CALayer bounds содержит NaN: [nan nan; nan nan]» crash?
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];
По какой-то причине, когда некоторые из моих пользователей являются с помощью приложения, часть коды, где frame
из UIImageView
создается ведет к следующему аварии:
Fatal Exception: CALayerInvalidGeometry CALayer bounds contains NaN: [nan nan; nan nan]
При проверке моих крешлогов, ошибка, кажется одинаковым во все прошивке версии, устройство , а также так что я это вынес. Как примечание стороны, я использую для реализации вышеуказанного кода:
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, потому что, как я уже говорил ранее, у меня никогда не было проблемы с предыдущей методологией. Что касается размера В начале, здесь есть метод в моем приложении делегат:
- (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 - «Not a Number»). Я полагаю, что некоторые из ваших объектов являются 'nil', когда вы пытаетесь создать кадры. Проверьте это через журналы и точки останова. – croX
@croX Но когда я использовал старую методологию, она никогда не использовалась для краха. Я не думаю, что UIImage ничто. –
@croX Возможно, вы правы на самом деле, я редактировал свой пост, чтобы показать, как я инициализировал свойство self.image, и я забыл его синтезировать. Мне интересно, как это вообще работает, из-за этого, или почему только иногда это приводит к его сбою. –