2009-08-05 3 views
15

Hier ist, wie ich das Hintergrundbild habe die Einrichtung und Inhalt-Modus:Wenn UIButton Inhalt Modus „Mitte“ Hintergrundbild ist pixelig

[btn setBackgroundImage:[UIImage imageNamed:@"dots_game_horiz_blue.png"] 
       forState:UIControlStateNormal]; 
[btn setContentMode:UIViewContentModeCenter]; 

Gibt es einen Grund, dass das Hintergrundbild verpixelt werden würde? Der Rahmen ist etwas größer als die Bildgröße und ich möchte nur, dass das Bild zentriert wird.

+1

Sorry, das aus der Tiefe der Zeit zu ziehen, aber es ist ein Speicherleck dort, wenn ich mich nicht täuscht. Keine Freigabe für das Alloc. –

+0

@Joseph, danke, dass du das herausgebracht hast. Ich habe den Code aktualisiert. –

Antwort

25

Ich denke, ein Hintergrundbild wird von der UIButton nicht als "Inhalt" betrachtet, so dass der Inhaltsmodus nicht auf das Hintergrundbild angewendet wurde. Stattdessen stelle ich das Bild der Schaltfläche und es funktionierte gut:

[btn setImage:[[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"dots_game_horiz_blue" ofType:@"png"]] forState:UIControlStateNormal]; 
[btn setContentMode:UIViewContentModeCenter]; 
+2

Das Problem mit dieser Lösung ist, dass der UIButton einen internen Rand hat. Wenn das Bild also nicht klein genug ist, wird es abgeschnitten, auch wenn es in die Schaltfläche passen sollte. –

+3

Das Einstellen des Inhaltsmodus führt hier eigentlich nichts aus.Schaltflächenbilder werden automatisch zentriert und nicht skaliert. Versuchen Sie, alles anders als zentriert zu setzen und zu sehen, was ich meine. –

+2

+1 Leider, wenn Sie Text sowie ein Bild haben wollen, wird dies nicht funktionieren :-( – Marc

5

Sie auch - (CGRect)backgroundRectForBounds:(CGRect)bounds implementieren könnte zu steuern, wie der Hintergrund gezeichnet wird.

+3

Dies funktionierte für mich.Ich mache eine benutzerdefinierte UIButton-Klasse, und ich habe diesen Code verwendet, um das Bild zu zentrieren: '- (CGRect) backgroundRectForBounds: (CGRect) Grenzen { \t UIImage * bkgImage = [self backgroundImageForState: self.state]; \t if (bkgImage) { \t \t CGFloat x = floorf ((self.bounds.size.width-bkgImage.size. Breite)/2); \t \t CGFloat y = floorf ((self.bounds.size.height-bkgImage.size.height)/2); \t \t Rückgabe CGRectMake (x, y, bkgImage.size.width, bkgImage.size.height); \t} \t sonst zurück [super backgroundRectForBounds: Grenzen]; } ' –

+0

" Overkill "Lösung imo. Sie können einfach einen Rahmen für die Schaltfläche festlegen, z. B .: UIImage * img = [UIImage imageNamed: @ "dots_game_horiz_blue.png"]; [btn setBackgroundImage: img forState: UIControlStateNormal]; btn.frame = CGRectMake (0, 0, img.größe.breite, img.größe.height); – Tony

0

Ich musste abgerundete Schaltflächen für Avatar-Fotos erstellen und fand die Antworten auf diese Frage, um zu helfen, aber sie brachten mich nicht den ganzen Weg dorthin. Ich implementierte die backgroundRectForBounds Methode und skalierte das Bild passend und es funktioniert gut.

Ich habe den Code auf GitHub.

https://github.com/brennanMKE/CircleButton

Das Verfahren wird auch weiter unten. Es ist wichtig, das Hintergrundbild und nicht das Bild für die Schaltfläche festzulegen, das mit dieser Methode nicht funktioniert.

- (CGRect)backgroundRectForBounds:(CGRect)bounds { 
    UIImage *backgroundImage = [self backgroundImageForState:self.state]; 
    if (backgroundImage) { 
     CGFloat maxWidth = CGRectGetWidth(self.frame); 

     CGFloat xDelta = maxWidth/backgroundImage.size.width; 
     CGFloat yDelta = maxWidth/backgroundImage.size.height; 
     CGFloat delta = xDelta > yDelta ? xDelta : yDelta; 

     CGFloat x = floorf((self.bounds.size.width - (backgroundImage.size.width * delta))/2); 
     CGFloat y = floorf((self.bounds.size.height - (backgroundImage.size.height * delta))/2); 

     return CGRectMake(x, y, backgroundImage.size.width * delta, backgroundImage.size.height * delta); 
    } 
    else { 
     return [super backgroundRectForBounds:bounds]; 
    } 
} 
1

Die richtige Lösung besteht darin, den Typ von System zu Benutzerdefiniert zu ändern. Dann berücksichtigt das Hintergrundbild den Inhaltstyp und nicht nur die Zentrierung. In meinem Fall setze ich ihn auf Aspect Fill und trage einen Radius von 45 Grad auf, um ihn zu runden. Einfach und funktioniert perfekt.

+0

Dies funktioniert nicht. Ich habe eine neue benutzerdefinierte Schaltfläche erstellt und den Inhaltsmodus auf "Mitte" festgelegt, füllt jedoch das Hintergrundbild immer noch mit der Größe der Ansicht. – devios1

11

In Ihrem xib/Storyboard, in dem Inspektor Attribute, müssen Sie:

  1. Stellen Sie Ihren UIButton Typ Custom
  2. Stellen Sie Ihr Bild in der Eigenschaft Image, nicht Background
  3. Validieren Schritt 2 , können Sie den Knopfrahmen sehen, der entsprechend dem Bildsatz geändert wird. Stellen Sie den Rahmen, wie Sie es sein wollen, wird das Bild selbst die Größe in
  4. Wählen Image für die Eigenschaft Edge, um passen Einsatz auf die Schaltfläche Bild anzuwenden
  5. Einsatz Werte eingeben Sie benötigen. Wenn Sie 5-Top, Bottom, Left, Right gesetzt ist, wird das Bild in der Schaltfläche, 5 mit einer Grenze von

zentriert werden können Sie die Änderungen in der xib/Storyboard-Ansicht sehen, keine Notwendigkeit, eine Debug zu starten.

Tipps: Inset ist das gleiche für alle Bilder der Taste (State Config)

+1

Alles, was mit 'In your xib/storyboard' beginnt, ist keine Lösung für diese Frage: D – Magoo

+0

Inzwischen hat sich die Lösung entwickelt. Sie können Schritt 4 überspringen und mit Schritt 5 durch den Größeninspektor (Regelsymbol) gehen. –

Verwandte Themen