Когда режим содержимого UIButton имеет «центр», фоновое изображение имеет пикселизацию - PullRequest
15 голосов
/ 06 августа 2009

Вот как я настраиваю фоновое изображение и режим контента:

[btn setBackgroundImage:[UIImage imageNamed:@"dots_game_horiz_blue.png"] 
               forState:UIControlStateNormal];
[btn setContentMode:UIViewContentModeCenter];

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

Ответы [ 5 ]

24 голосов
/ 06 августа 2009

Я полагаю, что фоновое изображение не считается «контентом» UIButton, поэтому режим контента не применяется к фоновому изображению. Вместо этого я установил изображение кнопки, и оно работало просто отлично:

[btn setImage:[[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"dots_game_horiz_blue" ofType:@"png"]] forState:UIControlStateNormal];
[btn setContentMode:UIViewContentModeCenter];
10 голосов
/ 03 сентября 2014

В вашей xib / storyboard, в инспекторе Атрибутов, вам нужно:

  1. Установите тип UIButton на Custom
  2. Установите ваше изображение в свойстве Image, а не Background
  3. Подтверждая шаг 2, вы можете видеть, как рамка кнопки изменяется в соответствии с набором изображений. Установите рамку так, как вы хотите, чтобы изображение было изменено в соответствии с
  4. Выберите Image для свойства Edge, чтобы применить вставку к изображению кнопки
  5. Введите нужные значения вставки. Если вы установите 5 на Top, Bottom, Left, Right, изображение будет центрировано внутри кнопки с границей 5

Вы можете увидеть изменения в представлении xib / storyboard, не нужно запускать отладку.

Совет: вкладка одинакова для всех изображений кнопки (State Config)

5 голосов
/ 15 января 2013

Вы также можете реализовать - (CGRect)backgroundRectForBounds:(CGRect)bounds для управления тем, как рисуется фон.

1 голос
/ 11 июля 2014

Правильным решением является изменение типа с Системного на Пользовательский. Тогда фоновое изображение будет соответствовать типу контента, а не центрироваться. В моем случае я установил Aspect Fill и применил угловой радиус 45 градусов для его округления. Просто и отлично работает.

0 голосов
/ 22 ноября 2013

Мне нужно было создать закругленные кнопки для фотографий аватаров и найти ответы на этот вопрос, чтобы помочь, но они не помогли мне полностью. Я реализовал метод 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];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...