Использование resizableImageWithCapInsets: изображение для кнопки работает только для набора состояний, другие состояния показывают «пробел» - PullRequest
25 голосов
/ 29 декабря 2011

При использовании resizableImageWithCapInsets: для создания изображения для кнопки UIB работает только нормальное состояние (состояние, заданное для изображения с помощью 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];

Ответы [ 2 ]

34 голосов
/ 30 декабря 2011

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

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

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

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

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

UIEdgeInsets insets = UIEdgeInsetsMake(16, 6, 16, 6);
image = [image resizableImageWithCapInsets:insets];
0 голосов
/ 29 марта 2013

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

...