Подтвердить что ты не робот

Использование resizableImageWithCapInsets: изображение для кнопки работает только для набора состояний, другие состояния показывают "пробел",

При использовании resizableImageWithCapInsets: для создания изображения для UIButton используется только нормальное состояние (состояние, заданное для изображения с использованием функции setBackgroundImage: forState:). Все остальные состояния показывают пробел вместо обрамленного изображения. UIButton говорит, что если изображение не задано для определенного состояния, изображение нормального состояния будет использоваться с наложением для отключенных и выбранных состояний.

Вот нормальное состояние:

enter image description here

Здесь находится выбранное состояние:

enter image description here

И вот исходное изображение:

enter image description here

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

Интересно, что stretchableImageWithLeftCapWidth: topCapHeight: работает. Теперь это устаревший метод в iOS 5, но с разницей, отображаемой в новом API, я могу зависеть от нее.

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

// This is the gist of the code being used
UIImage* image = [UIImage imageNamed:@"button.png"];
UIEdgeInsets insets = UIEdgeInsetsMake(image.size.height/2, image.size.width/2, image.size.height/2, image.size.width/2);
image = [image resizableImageWithCapInsets:insets];
[self.button setBackgroundImage:image forState:UIControlStateNormal];
// Even doing the following results in the same behaviour
[self.button setBackgroundImage:image forState:UIControlStateSelected];
4b9b3361

Ответ 1

Вы не создаете свои вставки правильно для укупорки изображения. Я воспроизвел вашу проблему и исправил ее, используя правильные вставки.

С вашим текущим кодом вы создаете кепки с половиной высоты и ширины изображения - это оставляет вам "растяжимую" область размером 0x0 пикселей, поэтому вы ничего не получаете посередине.

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

Предполагается, что колпачки определяют область изображения, которую нельзя растягивать. В случае вашего изображения button.png это 6 пикселей с левой и правой сторон и 16 пикселей сверху и снизу. Это не совсем стандартно, вы должны сказать своему графическому дизайнеру, что (по крайней мере, для левого-правого, который является наиболее распространенным растяжением) у вас должна быть только 1px-область в центре, однако это не влияет на результат. Если у вас есть растягиваемая область 1px, вы можете стандартизировать свой код, выбирая кепки из размера изображения, как вы пытались сделать в своем вопросе (каждая кепка тогда (image.size.height - 1) / 2 для верхней/нижней, такая же, но с шириной для левой/справа).

Чтобы получить правильные изображения на вашей кнопке, используйте следующий код для создания растягиваемого изображения:

UIEdgeInsets insets = UIEdgeInsetsMake(16, 6, 16, 6);
image = [image resizableImageWithCapInsets:insets];

Ответ 2

У меня возникали проблемы при использовании изменяемых по размеру изображений на iOS5. Оказывается, если ваша кнопка имеет тип "RountedRect" и вы управляете фоновыми изображениями, изменяемые по размеру изображения будут вести себя не так, как ожидалось. (iOS6 обрабатывает это нормально, предположительно, предполагая новый тип кнопки и при необходимости настраивая.)