Ich habe in letzter Zeit ein nerviges Problem erlebt.So erstellen Sie eine UIImageView-Erweiterung, die von ihr selbst gerundet wird
Angenommen, ich möchte ein Bild an mehreren Stellen in meiner Anwendung verwenden, und überall muss es abgerundet werden, um ein Kreis zu sein. Da ich möchte, dass mein Code sauber ist, denke ich, dass diese Funktionalität (von sich selbst zu runden) innerhalb der Klasse UIImageView erweitern sollte. Ich habe eine einfache Klasse erstellt, die Storyboard-Konstruktor überschreibt und ist verantwortlich für die Einstellung corner richtig:
class RoundedImageView: UIImageView {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.layer.cornerRadius = self.frame.size.width/2
self.layer.borderColor = UIColor.redColor().CGColor
self.layer.borderWidth = 2
self.layer.masksToBounds = true
}
}
Für Einschränkungen wie
- Breite: 100,
Höhe: 100
Dies funktioniert offensichtlich, da der Frame nach dem Aufruf des Konstruktors nicht geändert wird (weil er im Storyboard die richtigen Dimensionen hat). Das Problem tritt auf, wenn zum Beispiel sehen die Zwänge wie folgt aus:
Breite gleich zu 0,5 Super des
- Seitenverhältnis: 1: 1
weil die Rahmen Änderungen nach dem Konstruktor aufgerufen wird.
Was ich am Ende ist, etwas zu tun wie folgt aus:
override func viewDidLayoutSubviews(){
super.viewDidLayoutSubviews()
myRoundedImageInstance.layer.cornerRadius = ...
}
in jedem View-Controller, der die Instanz dieser Klasse nach innen hat ... ... das funktioniert, weil der Rahmen nach der Neuberechnung imageView ändert Abmessungen, aber das ist hässlich, und das Vorhandensein der Klasse scheint in diesem Fall unnötig.
Ich habe versucht, Frame-Neuberechnung in DrawRect - funktioniert auch nicht. Irgendwelche Ideen?
Warum verschieben Sie Ihren Rundungscode nicht auf 'RoundedImageView.layoutSubviews'? Eine weitere Möglichkeit besteht darin, die Ebenenmaske auf einen kreisförmigen Pfad zu setzen. – nielsbot
Wow, wusste nicht über diese Methode (layoutSubviews) für Ansichten, keine Controller anzeigen. Soll ich bei dieser Methode super anrufen? Ihre Antwort löste das Problem übrigens. Danke vielmals! – Adams
"Weil ich möchte, dass mein Code sauber ist, denke ich, dass diese Funktionalität (der Rundung selbst) in die Klasse eingefügt werden sollte, die UIImageView erweitert." Ich verstehe nicht warum. Warum bringst du die Funktionalität nicht in UIImage, d. H. Das Bild _itself_ schneidet sich selbst in einen Kreis? – matt