Сбой при использовании resizableImageWithCapInsets:UIEdgeInsetsMake

В основном я использую resizableImageWithCapInsets:UIEdgeInsetsMake. Но я не уверен, что это источник моей аварии. Я добавляю эти изменяемые изображения в ячейку таблицы. Я не совсем уверен, как это происходит.

Вот журнал.

 Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
    Exception Codes: KERN_INVALID_ADDRESS at 0xa1eab0c4
    Crashed Thread:  0

    Thread 0 name:  Dispatch queue: com.apple.main-thread
    Thread 0 Crashed:
    0   libobjc.A.dylib                 0x3966c5d0 objc_msgSend + 16
    1   Foundation                      0x3aa1750c probeGC + 60
    2   Foundation                      0x3aa1d526 -[NSConcreteMapTable removeObjectForKey:] + 30
    3   UIKit                           0x39e9f46c -[_UIImageViewPretiledImageWrapper dealloc] + 76
    4   libobjc.A.dylib                 0x3966e490 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 164
    5   CoreFoundation                  0x3a72882c _CFAutoreleasePoolPop + 12
    6   Foundation                      0x3aa12e10 -[NSAutoreleasePool release] + 116
    7   UIKit                           0x39b0f80c -[UITableView layoutSubviews] + 220
    8   UIKit                           0x39acb892 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 254
    9   QuartzCore                      0x37fce4e6 -[CALayer layoutSublayers] + 210
    10  QuartzCore                      0x37fce088 CA::Layer::layout_if_needed(CA::Transaction*) + 456
    11  QuartzCore                      0x37fcefac CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 12
    12  QuartzCore                      0x37fce996 CA::Context::commit_transaction(CA::Transaction*) + 234
    13  QuartzCore                      0x37fce7a8 CA::Transaction::commit() + 312
    14  QuartzCore                      0x37fce60c CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 56
    15  CoreFoundation                  0x3a7ba93e __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 18
    16  CoreFoundation                  0x3a7b8c34 __CFRunLoopDoObservers + 272
    17  CoreFoundation                  0x3a7b8f8e __CFRunLoopRun + 742
    18  CoreFoundation                  0x3a72c238 CFRunLoopRunSpecific + 352
    19  CoreFoundation                  0x3a72c0c4 CFRunLoopRunInMode + 100
    20  GraphicsServices                0x37a65336 GSEventRunModal + 70
    21  UIKit                           0x39b1c28c UIApplicationMain + 1116

2 ответа

У меня была та же проблема, это происходило только с устройствами с iOS5.x, изменяющими размер UIImageView, которые отображают UIImage, созданный таким образом:

    UIEdgeInsets edgeInsets = UIEdgeInsetsMake(topCapHeight, leftCapWidth, topCapHeight, leftCapWidth);
    image = [originalImage resizableImageWithCapInsets:edgeInsets];

это, вероятно, ошибка iOS, которая была исправлена ​​в iOS6.x

если ваш случай изменяет размер изображения с помощью критериев зеркалирования, вы можете использовать этот способ:

создайте категорию UIImage и добавьте этот метод экземпляра:

- (UIImage*)resizableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight </b>
{
    UIImage *image = nil;    
    float osVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (osVersion < 6.0) {
        image = [self stretchableImageWithLeftCapWidth:leftCapWidth topCapHeight:topCapHeight];
    } else {
        UIEdgeInsets edgeInsets = UIEdgeInsetsMake(topCapHeight, leftCapWidth, topCapHeight, leftCapWidth);
        image = [self resizableImageWithCapInsets:edgeInsets];
    }
    return image;
}

метод: - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight

устарела в документации iOS, но не в среде, это означает, что вы можете использовать ее, когда вы без проблем запускаете свое приложение на устройстве с iOS5.x, и использовать новый поддерживаемый метод для устройств с iOS 6 или выше,

Просто к вашему сведению.

У меня также был сбой, похожий на этот, и исправление было не в коде, а в самом активе.

Как говорится в документации Apple, область изменения размера актива должна составлять 1 на 1 пиксель, поэтому убедитесь, что это так.

- (UIImage *) resizableImageWithCapInsets: (UIEdgeInsets) capInsets

Во время масштабирования или изменения размера изображения области, покрытые крышкой, не масштабируются и не изменяют размер. Вместо этого область пикселей, не покрытая колпачком в каждом направлении, выложена мозаикой, слева направо и сверху вниз, чтобы изменить размер изображения. Этот метод часто используется для создания кнопок переменной ширины, которые сохраняют те же закругленные углы, но центральная область которых увеличивается или уменьшается по мере необходимости. Для лучшей производительности используйте мозаичную область размером 1x1 пикселя.

Другие вопросы по тегам