【问题标题】:Migration from Swift 3 to Swift 4 Navigation Bar broken interface从 Swift 3 迁移到 Swift 4 导航栏损坏的界面
【发布时间】:2017-10-01 09:39:27
【问题描述】:

我已将我的应用程序从 Swift 3.1 迁移到 Swift 4.0(Xcode 8.3.3 到 Xcode 9.0),现在我的界面的某些部分已损坏。导航控制器的导航栏完全一团糟。请看截图:

有3个元素:

  • 左 Netfnet 徽标(图片)

  • 右信号强度(图像)

  • 右二维码按钮

如您所见,两张图片太大且不在中心,按钮变形(应该是完美的正方形,所有图片也是)。 有生成导航控制器的代码:

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] //
    }

}

我可以自己直接降低图像的分辨率,但我只是不明白为什么在 Swift 3.1 中翻转很好,而在 Swift 4.0 中却被破坏了。

我会感谢任何帮助或建议。

【问题讨论】:

    标签: user-interface swift3 uinavigationcontroller uinavigationbar swift4


    【解决方案1】:

    您必须添加宽度和高度限制。

    CustomNavigationController 中的 barImageViewbarButton 应如下所示:

    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)
    }
    

    您在LogoWithSignalStrength 中的signalStengthImageView

    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
    

    【讨论】:

    • 感谢您的帮助!
    【解决方案2】:

    Xcode 9中,导航栏项是约束基础,添加:

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

    【讨论】:

    • 感谢您的回答,但此检查不是必需的。我的部署目标是 10.3,即使在真实设备上也没有检查,一切正常。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 2018-10-07
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    相关资源
    最近更新 更多