Когда режим содержимого UIButton является "центром", фоновое изображение пикселируется
Здесь, как я устанавливаю фоновое изображение и режим содержимого:
[btn setBackgroundImage:[UIImage imageNamed:@"dots_game_horiz_blue.png"]
forState:UIControlStateNormal];
[btn setContentMode:UIViewContentModeCenter];
Есть ли причина, что фоновое изображение будет пикселировано? Рама немного больше размера изображения, и я просто хочу, чтобы изображение было центрировано.
Ответы
Ответ 1
Я думаю, что фоновое изображение не считается "содержимым" UIButton, поэтому режим содержимого не применяется к фоновому изображению. Вместо этого я установил изображение кнопки, и он работал нормально:
[btn setImage:[[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"dots_game_horiz_blue" ofType:@"png"]] forState:UIControlStateNormal];
[btn setContentMode:UIViewContentModeCenter];
Ответ 2
В вашем xib/раскадровке в инспекторе атрибутов вам необходимо:
- Задайте тип
UIButton
Custom
- Установите изображение в свойстве
Image
, а не Background
- Проверяя шаг 2, вы можете видеть, что рамка кнопки изменилась в соответствии с набором изображений. Установите кадр так, как вы хотите, изображение изменит размер, чтобы оно соответствовало
- Выберите
Image
для свойства Edge
, чтобы применить вставку к изображению кнопки
- Введите требуемые значения вставки. Если вы установите 5 на
Top, Bottom, Left, Right
, изображение будет центрировано внутри кнопки с границей 5
Вы можете увидеть изменения в представлении xib/раскадровки, нет необходимости запускать отладочную версию.
Совет. Вставка одинакова для всех изображений кнопки (State Config
)
Ответ 3
Вы также можете реализовать - (CGRect)backgroundRectForBounds:(CGRect)bounds
для управления тем, как создается фоновый рисунок.
Ответ 4
Правильное решение - изменить тип от System to Custom. Тогда фоновое изображение будет считать тип контента, а не просто центрированием. В моем случае я установил его в Aspect Fill и применил радиус угла 45 градусов для его округления. Простой и отлично работает.
Ответ 5
Мне нужно было создать закругленные кнопки для фотографий аватаров и найти ответы на этот вопрос, чтобы помочь, но они не довели меня до конца. Я применил метод backgroundRectForBounds
и масштабировал изображение, чтобы оно соответствовало, и оно хорошо работает.
У меня есть код на GitHub.
https://github.com/brennanMKE/CircleButton
Этот метод также приведен ниже. Важно установить фоновое изображение, а не изображение кнопки, которая не работает с этим методом.
- (CGRect)backgroundRectForBounds:(CGRect)bounds {
UIImage *backgroundImage = [self backgroundImageForState:self.state];
if (backgroundImage) {
CGFloat maxWidth = CGRectGetWidth(self.frame);
CGFloat xDelta = maxWidth / backgroundImage.size.width;
CGFloat yDelta = maxWidth / backgroundImage.size.height;
CGFloat delta = xDelta > yDelta ? xDelta : yDelta;
CGFloat x = floorf((self.bounds.size.width - (backgroundImage.size.width * delta)) / 2);
CGFloat y = floorf((self.bounds.size.height - (backgroundImage.size.height * delta)) / 2);
return CGRectMake(x, y, backgroundImage.size.width * delta, backgroundImage.size.height * delta);
}
else {
return [super backgroundRectForBounds:bounds];
}
}