UIButton backgroundImage stretchableImageWithLeftCapWidth: topCapHeight проблема - PullRequest
4 голосов
/ 23 апреля 2011

У меня есть UIButton с указанной шириной 200. Его свойство autoresizingMask установлено в UIViewAutoresizingFlexibleWidth. UIImage применяется к свойству backgroundImage этой кнопки. Это UIimage определяется следующим образом:

[[UIImage imageNamed:@"buttonimage.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:0]

buttonimage.png имеет ширину 400 пикселей (ширина кнопки в 2 раза больше из-за разрешения сетчатки) и представляет собой прямоугольник со скругленными углами. В портретном режиме все нормально. Как только пользователь поворачивает устройство и iPhone переходит в альбомный режим, UIButton растягивается. Из-за этого поведения левая закругленная граница изображения остается неизменной (stretchableImageWithLeftCapWidth:), но правые углы также растягиваются. Есть ли какое-либо свойство, которое я забыл установить, чтобы гарантировать, что растянут только один указанный пиксель (например, десятый), а что-либо еще сохраняет его размеры?

Заранее спасибо!

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

Решено! Если ваше изображение называется «myImage.png» и это версия для сетчатки, просто назовите его «myImage@2x.png»

Ответы [ 2 ]

5 голосов
/ 23 апреля 2011

Есть ли свойство, которое я забыл установить? который обеспечивает только один указанный пиксель (например, десятый) растягивается и что-нибудь еще сохраняет его размеры?

Не совсем, но учитывая размер ваших изображений, вы должны перечитать свойство leftCapWidth .

Способ работы растягиваемых изображений: вы предоставляете левую крышку, следующий пиксель растягивается, а правая сторона изображения с width = (total width - left cap + 1) остается неизменной. Учитывая, что вы устанавливаете левую кепку на 10, а исходное изображение - на 400, вы говорите iOS, что правая нерастягиваемая правая сторона вашего изображения - 400-10-1=389px. То же самое относится и к вертикали. Проверьте, используете ли вы изображения @ 2x на обычном устройстве без @ 2x в названии, или если версии 2x не имеют ровно вдвое больше пикселей, или существует разница в верхнем / нижнем регистре. Вы можете узнать это, указав размер загруженного изображения.

Я не знаю, почему правая сторона вашего изображения растянута. Учитывая, что у вас есть height=0, все изображение может быть растянуто по вертикали, если высота кнопки изменяется, но маловероятно, что это вызывает искажение только правой стороны.

2 голосов
/ 24 апреля 2011

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

UIButton *button=[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 245, 51)];
button.autoresizingMask=UIViewAutoresizingFlexibleWidth;
[button setBackgroundImage:[[UIImage imageNamed:@"userbubble.png"] stretchableImageWithLeftCapWidth:40 topCapHeight:0] forState:UIControlStateNormal];
[self.view addSubview:button];

Я предполагаю, что проблема связана с используемым вами png или, возможно, с настройкой Compress PNG Files в вашем проекте. Кроме того, поскольку изображение, которое вы используете, настолько велико, попробуйте выложить левую крышку, скажем, на 40 или 50 пикселей.

...