IOS >> Свойство ImageView для UIButton >> Как настроить режим содержимого?

Есть ли способ установить свойство UIButton Image, BackgroundImage или ImageView Properties Content Mode?

Я пробовал прямой подход (конечно, это не сработало):

self.imageButton.imageView.contentMode = UIViewContentModeScaleAspectFit;

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

Ответ 1

Используя iOS7/8 с автоматической компоновкой, button.imageView не масштабируется, когда button выложено, например. для iPhone 6:

(lldb) po button
<UIButton: 0x7fb4f501d7d0; frame = (0 0; 375 275); opaque = NO; autoresize = RM+BM; tag = 102; layer = <CALayer: 0x7fb4f501d160>>

(lldb) po button.imageView
<UIImageView: 0x7fb4f51d21f0; frame = (0 0; 0 0); clipsToBounds = YES; hidden = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7fb4f5152860>>

После установки button изображения button.imageView принял размер изображения, например. для изображения 320x240:

(lldb) po button.imageView
<UIImageView: 0x7fb4f51d21f0; frame = (27.5 17.5; 320 240); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7fb4f5152860>>

Похоже, что button.imageView не соблюдает режим содержимого, но на самом деле это проблема с button.imageView.

Ответ заключается в том, чтобы установить button выравнивание содержимого.

Следующие наборы button image, устанавливает button.imageView режим содержимого и приравнивает button.imageView размер button:

[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;

Теперь button.imageView имеет тот же размер, что и button, и имеет желаемый режим содержимого.

(lldb) po button.imageView
<UIImageView: 0x7faac219a5c0; frame = (0 0; 375 275); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7faac219a6c0>>

Таким образом достигается желаемый результат. Очень удобно!

Ответ 2

если вы не хотите подкласса UIButton, вы можете попробовать это,

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    for (UIView *view in button.subviews) {
        if ([view isKindOfClass:[UIImageView class]]) {
            [view setContentMode:UIViewContentModeScaleAspectFit];
        }
    }

Ответ 3

У каждого UIButton есть один скрытый UIImageView. Поэтому мы должны установить режим содержимого, как показано ниже...

[[btn imageView] setContentMode: UIViewContentModeScaleAspectFit];