Ce code fonctionne correctement dans ios10. j'obtiens mon étiquette et un bouton d'image qui est le profil de photo d'utilisateur, rond circulaire .. ok. mais lors de l'exécution du simulateur xcode 9 ios11 je l'obtiens étiré. le cadre du bouton doit être 32x32, lors de la vérification de la carte SIM et de l'obtention de la vue et en disant à xcode de décrire la vue que j'obtiens en 170x32 ou quelque chose comme ça.
voici mon 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
intérieurUIBarButtonItem
, utilisezbutton.imageEdgeInsets = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: -20)
Réponses:
Raison
Le problème apparaît car à partir d'ios 11
UIBarButtonItem
utilise la mise en page automatique au lieu de traiter les cadres.Solution
Vous devez ajouter une contrainte de largeur pour ce bouton d'image si vous utilisez Xcode 9.
PS
button
n'est pasUIBarButtonItem
, il est à l'UIButton
intérieurUIBarButtonItem
. Vous ne devez pas définir de contrainte pourUIBarButtonItem
, mais pour les éléments à l'intérieur.la source
Merci à tous pour votre contribution! vous avez raison!. pour xcode9 ios11, vous devez mettre une contrainte.
la source
translatesAutoresizingMaskIntoConstraints
, puis j'ai découvert plus tard que totalement cassé iOS 9 (mais avait l'air bien sur iOS 10 et 11)Value of type 'UIBarButtonItem' has no member 'widthAnchor'
dans Xcode 9 à l'intérieur d'unif #available(iOS 11.0, *)
conditionnel?Le code Objective C est désormais obsolète. Mais pour l'utilisateur qui doit créer / maintenir des projets Objective C dans iOS 11, la traduction suivante de Swift (réponse de Karoly Nyisztor) à Objective C est utile.
la source
Eh bien, le nouveau
barButtonItem
utilise la mise en page automatique au lieu de traiter les cadres.L'image que vous ajoutiez au bouton est plus grande que la taille du bouton lui-même. C'est pourquoi le bouton lui-même a été étiré à la taille de l'image. Vous devez redimensionner l'image pour qu'elle corresponde à la taille du bouton nécessaire, avant de l'ajouter au bouton.
la source
J'ai écrit une petite extension pour définir les contraintes sur les éléments de la barre de navigation:
la source
UIButton
fonctionne très bien.J'ai fait cela en objectif en utilisant les lignes suivantes:
Merci Bon codage !!
la source
Ce que j'ai fait?
Dans mon application, j'ai ajouté une image de profil sur navigationBar à l'élément rightBarButton. avant iOS 11, il fonctionnait bien et s'affichait correctement, mais une fois mis à jour vers iOS 11, changez de comportement comme coup
J'ai donc ajouté l'
UIView
élément du bouton droit et définiUIButton
comme sous-vue deUIView
? Comme ci-dessous,Et j'ai défini des contraintes de hauteur et de largeur de
UIButton
.Et mon problème est résolu. N'oubliez pas de définir
UIView
la couleur d'arrière-plan de la couleur claire .la source
Changer le
widthAnchor
/heightAnchor
ne fonctionnera que sur les appareils iOS 11+. Pour les appareils iOS 10, vous devez utiliser la méthode classique de modification manuelle des cadres. Le fait est qu'aucune des deux approches ne fonctionne pour les deux versions, vous devez donc absolument alterner par programme en fonction de la version d'exécution, comme ci-dessous:la source
Même si iOS 11 utilise Autolayout pour la barre de navigation, il est possible de le faire fonctionner traditionnellement en définissant des cadres. Voici mon code fonctionnant pour ios11 et ios10 ou plus:
et voici comment l'élément de barre est composé:
la source
Mettre des contraintes par programme a fonctionné pour moi pour les utilisateurs exécutant iOS 11.X. Cependant, le bouton de la barre était toujours étiré pour les utilisateurs exécutant iOS 10.X.Je suppose que les critiques de l'AppStore exécutaient iOS 11.X et n'ont donc pas pu identifier mon problème, mon application s'est donc préparée pour la vente et a été téléchargée.
Ma solution était de changer simplement les dimensions de mon image en 30x30 dans un autre logiciel (la dimension de l'image précédente était 120x120).
la source
J'ai également eu du succès en implémentant
intrinsicContentSize
pour renvoyer une taille appropriée pour toute sous-classe UIView personnalisée que j'ai l'intention d'utiliser comme vue personnalisée.la source
J'ai créé un élément de bouton de barre, puis je l'ai ajouté à la barre de navigation.
Dans viewDidLoad ()
Ici, j'ai l'image de 28x28.
la source