5 Stimmen

iOS - kann eine UIImageView strecken, aber nicht eine UIButton?

Seht her:

//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;

Bei Verwendung der UIImageView (oben auskommentiert) wird das Bild entsprechend gestreckt - abgerundete Ecken behalten den korrekten Radius, da nur das mittlere Pixel des Bildes gestreckt wird.

Bei Verwendung der UIButton wird das Bild falsch gestreckt. Die Eckenradien werden nicht beibehalten und es wird hässlich.

Sowohl UIImageView als auch UIButton sind Unterklassen von UIView. Warum ändert die Schaltfläche ihre Größe anders als die imageView?

11voto

Lily Ballard Punkte 175449

Sie machen Annahmen über die Funktionsweise von UIButton. Sie ist nicht auf die gleiche Weise implementiert wie UIImageView. UIImageView ist nur eine Ansicht, ohne Unteransichten, und ihr Inhalt ist das Bild. UIButton ist anders, und die Art und Weise, wie es funktioniert, ist ein privates Implementierungsdetail.

Wenn Sie versuchen, ein Bild auf einer Schaltfläche angemessen zu strecken, sollten Sie -[UIImage stretchableImageWithLeftCapWidth:topCapHeight:] um ein UIImage zu erhalten, das weiß, wie es gestreckt werden sollte. Wenn Sie nur das mittlere Pixel strecken wollen, können Sie etwas wie

UIImage *image = [UIImage imageNamed:@"image.png"];
image = [image stretchableImageWithLeftCapWidth:floorf(image.size.width/2) topCapHeight:floorf(image.size.height/2)];

1voto

memmons Punkte 39772

A UIButton hat zwei Arten von Bildern, die angezeigt werden können: ein Vordergrundbild und ein Hintergrundbild. Das Hintergrundbild für eine Schaltfläche soll die Hintergrundtextur der Schaltfläche ersetzen. Als solches wird es sich so ausdehnen, dass es den gesamten Hintergrund ausfüllt. Das Vordergrundbild der Schaltfläche ist ein Symbol, das neben dem Text angezeigt werden kann oder auch nicht; es wird nicht gedehnt. Es Mai schrumpfen, wenn der Rahmen kleiner ist als das Bild, aber er wird nicht gestreckt.

Das Vorder- und Hintergrundbild einer Schaltfläche kann im Code wie folgt festgelegt werden:

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

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

Standardmäßig wird die backgroundImage einer Schaltfläche wird scaleToFill verwendet, um das Bild zu strecken. Wenn das Bild mit Hilfe von Cap-Insets gestreckt werden soll, sollten Sie diese auf das Bild setzen, bevor Sie es dem backgroundImage zuweisen, etwa so:

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];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X