При использовании resizableImageWithCapInsets: для создания изображения для UIButton используется только нормальное состояние (состояние, заданное для изображения с использованием функции setBackgroundImage: forState:). Все остальные состояния показывают пробел вместо обрамленного изображения. UIButton говорит, что если изображение не задано для определенного состояния, изображение нормального состояния будет использоваться с наложением для отключенных и выбранных состояний.
Вот нормальное состояние:
Здесь находится выбранное состояние:
И вот исходное изображение:
Ясно, что я использую измененное изображение, которое я предоставил, но изображение не рисует область изменения размера. (Вы можете видеть левый и правый края, но средняя область, которая должна быть растянута, просто не нарисована).
Интересно, что 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];