Использование resizableImageWithCapInsets: изображение для кнопки работает только для набора состояний, другие состояния показывают "пробел"
При использовании 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];
2 ответа
Вы не создаете свои вставки должным образом для ограничения изображения. Я воспроизвел вашу проблему и исправил ее, используя правильные вставки.
Используя ваш текущий код, вы создаете шапки с половиной высоты и ширины изображения - это оставляет вас с "растягиваемой" областью 0x0 пикселей - так что вы ничего не получите в середине.
Почему это не выглядит неправильно в нормальном состоянии кнопки, я не уверен - возможно, есть некоторая оптимизация, встроенная в UIButton, чтобы исправить вещи или автоматическое выравнивание, если вы не предоставляете растягиваемое изображение, и это не применяется к другим государствам.
Заглавные буквы должны определять область изображения, которую нельзя растягивать. В случае вашего изображения button.png это 6 пикселей слева и справа и 16 пикселей сверху и снизу. Это не совсем стандартно, вы должны сказать своему графическому дизайнеру, что (по крайней мере для левого-правого, который является наиболее распространенным растяжением) у вас должна быть только 1-пиксельная область в центре, однако это не влияет на результат. Если у вас есть растягиваемая область на 1 пиксель, то вы можете стандартизировать свой код, извлекая заглавные буквы из размера изображения, как вы пытались сделать в своем вопросе (тогда (image.size.height - 1) / 2
для верха / низа, то же самое, но с шириной влево / вправо).
Чтобы получить правильные изображения на кнопке, используйте следующий код для создания растягиваемого изображения:
UIEdgeInsets insets = UIEdgeInsetsMake(16, 6, 16, 6);
image = [image resizableImageWithCapInsets:insets];
У меня тоже возникали проблемы при использовании изменяемых размеров изображений на iOS5. Оказывается, что если ваша кнопка имеет тип "RountingRect" и вы управляете фоновыми изображениями, изображения с изменяемым размером не будут работать должным образом. (iOS6 справляется с этим нормально, предположительно, принимая ваш новый тип кнопки и корректируя при необходимости.)