it-swarm.com.ru

UIButton не слушает настройки режима контента?

firstButton - это UIButton типа Custom. Я программно помещаю три из них в каждую ячейку таблицы, таким образом:

[firstButton setImage:markImage forState:UIControlStateNormal];
[firstButton setContentMode:UIViewContentModeScaleAspectFit];
[cell.contentView addSubview:firstButton];

В другом месте, я говорю это для ClipToBounds. То, что я получаю, это обрезка центральной площади изображения, а не его масштабное отображение. Я пробовал это множеством способов, включая установку свойства mode для firstButton.imageView, который также, похоже, не работает.

85
Dan Ray

У меня такая же проблема. Я вижу, что этот вопрос немного устарел, но я хочу дать четкий и правильный ответ, чтобы сохранить других людей (таких как я), когда они появятся в их результатах поиска.

Мне потребовалось немного поиска и экспериментов, но я нашел решение. Просто установите ContentMode для «скрытого» ImageView, который находится внутри UIButton.

[[firstButton imageView] setContentMode: UIViewContentModeScaleAspectFit];
[firstButton setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];

Возможно, именно об этом говорил Дэн Рэй в своем принятом ответе, но я подозреваю, что нет.

178
Dave

Если вы имеете дело с изображением UIButton (в отличие от его backgroundImage), установка contentMode для самого UIButton или его imageView не имеет никакого эффекта (несмотря на то, что говорят другие ответы).

В качестве альтернативы сделайте это вместо этого:

self.button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
self.button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;

Или размер вашего изображения соответственно. 

ИЛИ просто используйте UIImageView (который должным образом учитывает contentMode) с прикрепленным к нему UITapGestureRecognizer или прозрачной UIButton поверх него. 

62
Alfie Hanssen

Вместо того, чтобы устанавливать contentMode на самой кнопке, вы захотите установить свойства contentHorizontalAlignment и contentVerticalAlignment и (что крайне важно) contentMode для imageView кнопки для любого вида заполнения или подгонки аспекта. Вот пример:

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
button.imageView.contentMode = UIViewContentModeScaleAspectFit;

Конечно, вы также можете делать другие вещи, такие как выравнивание изображения кнопки по верху кнопки. Если вам не нужна заливка или подгонка аспекта, вы можете просто установить выравнивание:

button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;

В Swift вы захотите использовать:

button.contentHorizontalAlignment = .fill
button.contentVerticalAlignment = .fill
button.imageView?.contentMode = .scaleAspectFit

Это работает для всех версий iOS, включая последние версии с автоматическим макетом (т.е. iOS 4 до iOS 11+).

40
Chris Nolet

После нескольких часов путаницы, вот как я заставил его работать под iOS 3.2. Как сказал Сумерк, использование setBackgroundImage вместо setImage сделало эту работу за меня.

CGRect myButtonFrame = CGRectMake(0, 0, 250, 250);
UIImage *myButtonImage = [UIImage imageNamed:@"buttonImage"];

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];

[myButton setBackgroundImage:myButtonImage forState:UIControlStateNormal];
[myButton setFrame: myButtonFrame];
[myButton setContentMode: UIViewContentModeScaleAspectFit];
7
Pierre

Ответ заключается в том, чтобы использовать UIImageView со всеми необходимыми настройками режима содержимого, а затем наложить на него пользовательскую кнопку. Глупо, что вы не можете сделать все это одним выстрелом, но кажется, что вы не можете.

6
Dan Ray

Нашел исправление для этого. Установите для свойства adjustsImageWhenHighlighted для UIButton значение NO.

  UIButton *b = [[UIButton alloc] initWithFrame:rect];
        [b setImage:image forState:UIControlStateNormal];
        [b.imageView setContentMode:UIViewContentModeScaleAspectFill];
        [b setAdjustsImageWhenHighlighted:NO];

Надеюсь это поможет. Не стесняйтесь комментировать ниже, я буду следить за любыми вопросами, которые у вас есть.

4
iOSDevSF

Единственное решение, которое сработало для меня:

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

Мой ответ похож на ответ Кубы. Мне нужно, чтобы мое изображение было установлено программно.

UIImage *image = [[UIImage alloc] initWithContentsOfFile:...];
[button setBackgroundImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill; //this is needed for some reason, won't work without it.
for(UIView *view in button.subviews) {
    view.contentMode = UIViewContentModeScaleAspectFill;
}
2
ninjaneer

Swift 3

self.firstButton.imageView?.contentMode = .scaleAspectFill
2
Vaibhav Saran

Я полагаю, что у нас есть проблема простого конструктора интерфейса - очевидно, IB игнорирует любые изменения режима содержимого ПОСЛЕ того, как вы установили свойство image.

решение простое: установите режим содержимого, удалите предварительно установленные имена изображений (убедитесь, что вы удаляете его во всех состояниях, по умолчанию, выделены и т. д.), а затем снова введите нужные имена изображений во всех требуемых состояниях - et voilà ,.

1
JohnPayne

Вместо setImage попробуйте setBackgroundImage

1
dusker

Я также советую взглянуть на свойство adjustsImageWhenHighlightedUIButton, чтобы избежать странных деформаций изображения при нажатии кнопки.

0
MonsieurDart

Если кажется, что UIButton не слушает настройки ограничения макета, проверьте, не превышают ли изображения размер кнопки. Всегда используйте изображения @ 2x и @ 3x для разрешения сетчатки.

0
Totoro

Пытаясь понять это, мой метод со временем стал немного хакерским, и я завел подкласс UIButton и переопределил setHighlighted:

Для меня это работает просто сбить изображение альфа до .5, потому что они на черном фоне.

Тем не менее, это работает, только если я закомментирую [super setHighlighted:] (там, где, кажется, происходит растягивающий код), который просто не кажется правильным способом решить это вообще ... все, кажется, работает нормально, хотя. Посмотрим, как это будет продолжаться, пока я буду над этим работать.

- (void)setHighlighted:(BOOL)highlight {
    if (highlight) {
        [self.imageView setAlpha:.5];
    }  else {
        [self.imageView setAlpha:1];        
    }

//    [super setHighlighted:highlight];
}
0
jankins

Если кто-то ищет ответ, который работает в iOS 6 и iOS 7 и раскадровке:

Вы можете установить изображение в вашей раскадровке:

enter image description here

А потом:

for(UIView* testId in self.subviews) {
    if([testId isKindOfClass:[UIImageView class]])
        [testId setContentMode:UIViewContentModeScaleAspectFill];
}
0
Jakub