2016-07-04 10 views
0

Ich habe eine UIButton, und ich möchte auf die UIImageView des Hintergrundbildes zugreifen, so dass ich das Bild rund machen kann. Ich weiß, dass ich das Bild selbst beeinflussen kann, aber ich würde es lieber eleganter machen. Ich weiß auch, dass ich die button.currentBackgroundImage Eigenschaft verwenden kann, um das UIImage im Hintergrund zu erhalten, aber ich möchte die Ansicht selbst. Sobald ich die Ansicht habe, beabsichtige ich, diesen Code zu verwenden:Zugriff auf die UIImageView des Hintergrundbildes eines UIButton

buttonImageView.layer.cornerRadius = buttonImageView.frame.size.width/2; 
buttonImageView.clipsToBounds = YES; 

Wie kann ich auf den ButtonImageView zugreifen?

EDIT: Aufgrund @ vhristoskov Vorschläge, habe ich versucht, den Knopf selbst mit diesem Code Zuschneiden:

self.button.layer.cornerRadius = self.button.frame.size.width/2; 
self.button.clipsToBounds = YES; 

Und es hat diese Form:

enter image description here

Nach dem Debuggen Ich fand, dass frame.size.width war 46, wenn es 100 hätte sein sollen. Also habe ich diesen Code stattdessen versucht:

self.button.layer.cornerRadius = self.button.currentBackgroundImage.size.width/2; 
self.button.clipsToBounds = YES; 

Und das erzeugt diese Form:

enter image description here

Und diesmal wurde die cornerRadius bis 65. So gesetzt wird scheint es tatsächlich wie mein Problem ist, dass ich im Moment die richtige Breite haben nicht . Auf welche Eigenschaft sollte ich zugreifen, um die richtige Nummer zu erhalten?

+0

Gibt es einen Grund, nicht den gleichen Code direkt auf Ihren UIButton zu bewerben? – vhristoskov

+0

@vhristoskov hmmm Ich habe gerade versucht, und ich bekam ein seltsames Ergebnis, das Bild war seltsam geformt. Ich kann einen Screenshot hinzufügen, was mit meiner Frage passiert ist, wenn Sie möchten. – multitaskPro

+0

Das wäre großartig.Sie könnten auch ein Bild Ihrer Beschränkungen in der IB hinzufügen (oder den Code, den Sie verwendet haben, um den Rahmen der Schaltfläche zu setzen). – vhristoskov

Antwort

0

Nun, wie ich schon vermutet habe und wie Sie bereits festgestellt haben - das Problem liegt in der Tastengröße. Um sicher zu gehen, dass die Größe Ihrer Schaltfläche zur Laufzeit Ihren Erwartungen entspricht, überprüfen Sie Ihre Einschränkungen. Im Beispiel unten hat die Schaltfläche eine vertikale und horizontale zentrale Ausrichtung und feste Breite und Höhe.

Button Constraints

Constraints:

enter image description here

Um perfekt kreisförmigen Knopf haben Sie button.width == button.height haben sollte. Wenn diese Bedingung Code erfüllt ist, soll wie ein Zauber funktionieren:

self.button.layer.cornerRadius = CGRectGetWidth(self.button.frame)/2; 
self.button.clipsToBounds = YES; 

enter image description here

+0

Es stellte sich also heraus, dass mein Problem darin bestand, die Tastenbreite bei viewDidLoad zu bekommen, und anscheinend ist die Breite nur bei viewDidAppear gültig. Ich werde diese Antwort trotzdem akzeptieren, weil sie den Kern meiner Lösung enthält. Danke für die Hilfe :) – multitaskPro

0

Unter der Annahme, dass Sie so etwas wie genannt:

[self.myButton setBackgroundImage:[UIImage imageNamed:@"image"] forState:UIControlStateNormal]; 

in viewDidLoad oder früher, können Sie dann die in viewDidAppear folgenden nennen:

if (self.myButton.subviews.count > 0 && [self.myButton.subviews[0] isKindOfClass:[UIImageView class]]) { 
    UIImageView *imageView = self.myButton.subviews[0]; 
    imageView.layer.cornerRadius = imageView.frame.size.width/2; 
    imageView.clipsToBounds = YES; 
} 

aber es ist nicht mehr elegant als der Subview Ordnung ist ein Implementierungsdetail von UIButton und kann sich jederzeit ändern.

+0

Es scheint, dass das UIButton tatsächlich keine Unteransichten hat:/ – multitaskPro

+0

Ich habe festgestellt, dass die Unteransichten nur von viewDidAppear hinzugefügt wurden, aber noch nicht zur Zeit von viewDidLoad vorhanden waren. Es hängt möglicherweise davon ab, wann das Hintergrundbild zuerst eingestellt wird. –