Dieser Code funktioniert in ios10 einwandfrei. Ich bekomme mein Etikett und eine Bildschaltfläche, die das Benutzerfoto-Profil ist, kreisförmig rund .. ok. aber wenn ich xcode 9 ios11 simulator laufen lasse, bekomme ich es gestreckt. Der Schaltflächenrahmen muss 32x32 sein, wenn ich die Sim überprüfe und die Ansicht erhalte und xcode anweise, die Ansicht zu beschreiben, die ich als 170x32 oder so etwas ausgeben lasse.
Hier ist mein Code.
let labelbutton = UIButton( type: .system)
labelbutton.addTarget(self, action:#selector(self.toLogin(_:)), for: .touchUpInside)
labelbutton.setTitleColor(UIColor.white, for: .normal)
labelbutton.contentHorizontalAlignment = .right
labelbutton.titleLabel?.font = UIFont.systemFont(ofSize: 18.00)
let button = UIButton(type: .custom)
button.addTarget(self, action:#selector(self.toLogin(_:)), for: .touchUpInside)
button.frame = CGRect(x: 0, y: 0, width: 32, height: 32)
button.setTitleColor(UIColor.white, for: .normal)
button.setTitleColor(UIColor.white, for: .highlighted)
var buttomItem : UIBarButtonItem = UIBarButtonItem()
buttomItem.customView = button
buttomItem.target = self
buttomItem.action = "ToLogin"
var labelItem : UIBarButtonItem = UIBarButtonItem()
labelItem.customView = labelbutton
labelItem.target = self
labelItem.action = "ToLogin"
if let user = PFUser.current() {
print("LOGIN : checkiando si existe usuario ")
labelbutton.setTitle(USERNAME, for: UIControlState.normal)
labelbutton.sizeToFit()
if(user["profile_photo_url"] != nil) {
print(" ENCONTRO PROFILE PHOTO URL NOT NIL Y ES \(user["profile_photo_url"])")
let photoURL = user["profile_photo_url"] as! String
let a = LoginService.sharedInstance
a.downloadImage(url: photoURL, complete: { (complete) in
if (complete) {
button.setImage(LoginService.sharedInstance.profile_photo! , for: UIControlState.normal)
button.layer.cornerRadius = 0.5 * button.bounds.size.width
// button.imageView!.contentMode = .scaleAspectFit
// button.imageView!.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
//button.imageView!.contentMode = .scaleAspectFit
//button.imageView!.clipsToBounds = true
//button.imageView!.layer.cornerRadius = 60
button.clipsToBounds = true
self.NavigationItem.rightBarButtonItems = [buttomItem,labelItem]
}
})
} else {
self.NavigationItem.rightBarButtonItem = labelItem
}
print(" EL FRAME DEL BUTTON ES \(button.frame)")
} else {
labelbutton.setTitle("Login", for: UIControlState.normal)
labelbutton.sizeToFit()
self.NavigationItem.rightBarButtonItem = labelItem
}
UIButton
UIBarButtonItem
button.imageEdgeInsets = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: -20)
Antworten:
Grund
Das Problem tritt auf, weil ab ios 11
UIBarButtonItem
Autolayout verwendet wird, anstatt sich mit Frames zu befassen.Lösung
Wenn Sie Xcode 9 verwenden, sollten Sie für diese Bildschaltfläche eine Breitenbeschränkung hinzufügen.
PS
button
ist nichtUIBarButtonItem
, es istUIButton
drinnenUIBarButtonItem
. Sie sollten die Einschränkung nicht fürUIBarButtonItem
, sondern für darin enthaltene Elemente festlegen .quelle
Vielen Dank für Ihren Beitrag! ihr habt recht! Für xcode9 ios11 müssen Sie eine Einschränkung festlegen.
quelle
translatesAutoresizingMaskIntoConstraints
und später herausgefunden, dass iOS 9 völlig kaputt war (aber auf iOS 10 und 11 gut aussah)Value of type 'UIBarButtonItem' has no member 'widthAnchor'
in Xcode 9 innerhalb einerif #available(iOS 11.0, *)
Bedingung?Der objektive C-Code ist jetzt veraltet. Für den Benutzer, der Objective C-Projekte in iOS 11 erstellen / warten muss, ist die folgende Übersetzung von Swift (Antwort von Karoly Nyisztor) nach Objective C hilfreich.
quelle
Nun, das neue
barButtonItem
verwendet Autolayout, anstatt sich mit Frames zu befassen.Das Bild, das Sie der Schaltfläche hinzugefügt haben, ist größer als die Schaltfläche selbst. Aus diesem Grund wurde die Schaltfläche selbst auf die Bildgröße gedehnt. Sie müssen die Größe des Bilds an die Größe der gewünschten Schaltfläche anpassen, bevor Sie es der Schaltfläche hinzufügen.
quelle
Ich habe eine winzige Erweiterung zum Festlegen der Einschränkungen für Navigationsleistenelemente geschrieben:
quelle
UIButton
funktioniert das sehr gut.Ich habe dies objektiv mit folgenden Zeilen gemacht:
Danke Viel Spaß beim Codieren !!
quelle
Was ich getan habe?
In meiner App habe ich ein Profilbild in der Navigationsleiste unter dem Element "RightBarButton" hinzugefügt. vor iOS 11 funktionierte es gut und wurde ordnungsgemäß angezeigt, aber wenn es auf iOS 11 aktualisiert wurde, änderte sich das Verhalten wie Schlag
Also habe ich
UIView
im rechten Schaltflächenelement hinzugefügt undUIButton
als Unteransicht vonUIView
? Wie unten,Und ich setze Höhen- und Breitenbeschränkungen von
UIButton
.Und mein Problem ist gelöst. Vergessen Sie nicht, die
UIView
Hintergrundfarbe als klare Farbe festzulegen.quelle
Das Ändern von
widthAnchor
/heightAnchor
funktioniert nur auf iOS 11+ Geräten. Für iOS 10-Geräte müssen Sie die Frames auf klassische Weise manuell ändern. Die Sache ist, dass keiner der beiden Ansätze für beide Versionen funktioniert, so dass Sie sich je nach Laufzeitversion unbedingt programmgesteuert abwechseln müssen, wie unten:quelle
Obwohl iOS 11 Autolayout für die Navigationsleiste verwendet, ist es möglich, dass es traditionell zum Festlegen von Frames funktioniert. Hier ist mein Code, der für ios11 und ios10 oder älter funktioniert:
und so setzt sich das Barelement zusammen:
quelle
Das programmgesteuerte Setzen von Einschränkungen hat bei Benutzern mit iOS 11.X für mich funktioniert. Die Balkentaste wurde jedoch für Benutzer mit iOS 10.X immer noch gestreckt. Ich denke, die AppStore-Rezensenten haben iOS 11.X ausgeführt, daher konnte ich mein Problem nicht identifizieren, sodass meine App zum Verkauf bereit war und hochgeladen wurde.
Meine Lösung bestand darin, die Abmessungen meines Bildes in einer anderen Software einfach auf 30 x 30 zu ändern (die vorherige Bildabmessung betrug 120 x 120).
quelle
Ich hatte auch Erfolg bei der Implementierung
intrinsicContentSize
, um eine geeignete Größe für jede benutzerdefinierte UIView-Unterklasse zurückzugeben, die ich als benutzerdefinierte Ansicht verwenden möchte.quelle
Ich habe ein Balkenschaltflächenelement erstellt und es dann zur Navigationsleiste hinzugefügt.
In viewDidLoad ()
Hier habe ich das Bild von 28x28.
quelle