2

J'ai migré mon application de Swift 3.1 à Swift 4.0 (Xcode 8.3.3 à Xcode 9.0) et une partie de mon interface est maintenant brisée. La barre de navigation du contrôleur de navigation est désordre complet. S'il vous plaît, regardez capture d'écran: enter image description hereMigration de Swift 3 à Swift 4 Barre de navigation de l'interface cassée

Il y a 3 éléments:

  • gauche logo Netfnet (image)

  • droite Puissance du signal (image)

  • bouton droit QR Code

Comme vous pouvez le voir, deux images sont trop grandes et non dans le centre et le bouton a été déformé (il devrait être carré parfait, toutes les images aussi). Il y a un code qui commande généré de navigation:

import UIKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     settings() 
    } 

    func settings() { 
     let color = UIColor(red: 81/255, green: 155/255, blue: 22/255, alpha: 1.0) 
     self.navigationController?.navigationBar.barTintColor = color 

     let logoImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 35, height: 35)) 
     logoImageView.contentMode = .scaleAspectFit 
     let logo = UIImage(named: "littleLogoImage") 
     logoImageView.image = logo 
     navigationItem.leftBarButtonItem = UIBarButtonItem(customView: logoImageView) 

     let signalStengthImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 35, height: 35)) 
     signalStengthImageView.contentMode = .scaleAspectFit 
     signalStengthImageView.image = UIImage(named: "signalStrength4") 
     let signalStengthImageItem = UIBarButtonItem(customView: signalStengthImageView) 

     let button = UIButton(type: .custom) 
     button.setImage(UIImage(named: "qrCodeButton"), for: .normal) 
     button.frame = CGRect(x: 0, y: 0, width: 35, height: 35) 
     let qrCodeButtonItem = UIBarButtonItem(customView: button) 

     navigationItem.rightBarButtonItems = [qrCodeButtonItem, signalStengthImageItem] // 
    } 

} 

Je peux réduire la résolution des images directement moi-même, mais je ne comprends pas pourquoi éversion était bien dans Swift 3.1 et à Swift 4.0 est cassé.

Je serai reconnaissant pour toute aide ou conseil.

Répondre

2

Vous devez ajouter des contraintes de largeur et de hauteur.

Votre barImageView et barButton dans CustomNavigationController devrait être comme ci-dessous:

func barImageView(imageName: String) -> UIBarButtonItem { 
    let imgView = imageView(imageName: imageName) 
    let widthConstraint = imgView.widthAnchor.constraint(equalToConstant: 35) 
    let heightConstraint = imgView.heightAnchor.constraint(equalToConstant: 35) 
    heightConstraint.isActive = true 
    widthConstraint.isActive = true 
    return UIBarButtonItem(customView: imgView) 
} 

func barButton(imageName: String, selector: Selector) -> UIBarButtonItem { 
    let button = UIButton(type: .custom) 
    button.setImage(UIImage(named: imageName), for: .normal) 
    button.frame = CGRect(x: 0, y: 0, width: 35, height: 35) 
    button.addTarget(self, action: selector, for: .touchUpInside) 
    let widthConstraint = button.widthAnchor.constraint(equalToConstant: 35) 
    let heightConstraint = button.heightAnchor.constraint(equalToConstant: 35) 
    heightConstraint.isActive = true 
    widthConstraint.isActive = true 
    return UIBarButtonItem(customView: button) 
} 

Votre signalStengthImageView à LogoWithSignalStrength:

signalStengthImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 35, height: 35)) 
signalStengthImageView.contentMode = .scaleAspectFit 
let widthConstraint = signalStengthImageView.widthAnchor.constraint(equalToConstant: 35) 
let heightConstraint = signalStengthImageView.heightAnchor.constraint(equalToConstant: 35) 
heightConstraint.isActive = true 
widthConstraint.isActive = true 
+0

Merci pour votre réponse, cela fonctionne maintenant! – Alex

+0

Merci pour votre aide! – Alex

2

En Xcode 9, navigation éléments de la barre sont la base de contraintes, ajouter ceci:

if #available(iOS 11.0, *) { 
    logoImageView.widthAnchor.constraint(equalToConstant: 35).isActive = true 
    logoImageView.heightAnchor.constraint(equalToConstant: 35).isActive = true 
} else { 
    //set frames 
} 
+0

Merci pour votre réponse mais cette vérification n'est pas nécessaire. Ma cible de déploiement est 10.3 et tout fonctionne sans vérifier même sur les vrais périphériques. Merci pour l'aide! – Alex