Когда режим содержимого 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];
    }
}