2015-02-15 4 views
0

я следующий фрагмент кода, который просто инициализирует 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. Может ли это вызвать проблему? Мне интересно, как это работает даже большую часть времени и иногда происходит сбой?

+0

Ваша ошибка вызвана, потому что вы вводите недопустимые номера (NaN - «Not a Number»). Я полагаю, что некоторые из ваших объектов являются 'nil', когда вы пытаетесь создать кадры. Проверьте это через журналы и точки останова. – croX

+0

@croX Но когда я использовал старую методологию, она никогда не использовалась для краха. Я не думаю, что UIImage ничто. –

+0

@croX Возможно, вы правы на самом деле, я редактировал свой пост, чтобы показать, как я инициализировал свойство self.image, и я забыл его синтезировать. Мне интересно, как это вообще работает, из-за этого, или почему только иногда это приводит к его сбою. –

ответ

1

Причина этого в том, что пользователи загружают фотографии из своей библиотеки фотографий, если для загрузки фотографии недостаточно памяти, тогда nil будет возвращен для UIImage. Поэтому мой код выше пытался создать UIImageView с frame на основе размера nilUIImage, что привело к его сбою. Я исправил это, обратившись к делу, когда nilUIImage возвращается с моего UIImagePickerController.