iOS - может растянуть UIImageView, но не UIButton? - PullRequest
5 голосов
/ 23 февраля 2011

Вот:

//UIImageView* stretchTest = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.png"]];
//[self addSubview:stretchTest];


UIButton *stretchTest = [UIButton buttonWithType:UIButtonTypeCustom];
[stretchTest setFrame:CGRectMake(0, 0, 400, 100)];
[stretchTest setBackgroundImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal];
[self addSubview:stretchTest];

stretchTest.contentStretch = CGRectMake(0.5, 0.5, 0, 0);
stretchTest.contentMode = UIViewContentModeScaleToFill;

CGRect frame = stretchTest.frame;
frame.size.height = 300;
stretchTest.frame = frame;

Используя UIImageView (закомментировано выше), изображение растягивается соответствующим образом - закругленные углы сохраняют правильный радиус, потому что растягивается только центральный пиксель изображения.

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

UIImageView и UIButton являются подклассами UIView. Почему размер кнопки изменяется не так, как у imageView?

Ответы [ 2 ]

11 голосов
/ 23 февраля 2011

Вы делаете предположения о том, как работает UIButton.Это не реализовано так же, как UIImageView.UIImageView - это просто представление без подпредставлений, а его содержимое - изображение.UIButton отличается, и способ его работы является частной реализацией.

Если вы пытаетесь соответствующим образом растянуть изображение на кнопке, вы должны использовать -[UIImage stretchableImageWithLeftCapWidth:topCapHeight:], чтобы получить UIImage, который знает, как это должно происходить.быть растянутым.Если вы хотите растянуть только средний пиксель, вы можете использовать что-то вроде

UIImage *image = [UIImage imageNamed:@"image.png"];
image = [image stretchableImageWithLeftCapWidth:floorf(image.size.width/2) topCapHeight:floorf(image.size.height/2)];
1 голос
/ 30 октября 2012

A UIButton может отображать два типа изображений - изображение переднего плана и фоновое изображение.Предполагается, что фоновое изображение для кнопки заменит фоновую текстуру кнопки.Таким образом, он будет растягиваться, чтобы заполнить весь фон.Предполагается, что изображение переднего плана кнопки будет значком, который может отображаться или не отображаться рядом с текстом;это не будет растягиваться.Он может уменьшиться, если рамка меньше изображения, но она не будет растягиваться.

Передний план и фоновое изображение кнопки можно установить в коде, подобном следующему:

// stretchy
[self setBackgroundImage:backgroundImage forState:UIControlStateNormal];  

// not stretchy
[self setImage:forgroundImage forState:UIControlStateNormal]; 

По умолчанию backgroundImage кнопки будет использовать scaleToFill для растягивания изображения.Если вам нужно растянуть изображение, используя верхние вставки, вы должны установить их на изображение, прежде чем назначить его backgroundImage, например:

UIImage *image = [UIImage imageNamed:@"bg_image.png"];

/* This assumes your image will have a 1px column and 1px row of pixels 
   in the horizontal and vertical middle of the image that should be
   stretchable. If that's not the case (such as asymetrical buttons) 
   you need to adjust the caps */
image = [image stretchableImageWithLeftCapWidth:floorf(image.size.width/2)
               topCapHeight:floorf(image.size.height/2)];
[self setBackgroundImage:image forState:UIControlStateNormal];  
...