User interface 从Swift 3迁移到Swift 4导航栏断开的界面

User interface 从Swift 3迁移到Swift 4导航栏断开的界面,user-interface,swift3,uinavigationcontroller,uinavigationbar,swift4,User Interface,Swift3,Uinavigationcontroller,Uinavigationbar,Swift4,我已经将我的应用程序从Swift 3.1迁移到Swift 4.0(从Xcode 8.3.3迁移到Xcode 9.0),我的部分界面现在已经损坏。导航控制器的导航栏已完成。请看截图: 有3个要素: 左Netfnet徽标(图像) 右信号强度(图像) 右二维码按钮 正如你们所看到的,两张图片太大,不在中间,按钮变形了(所有图片都应该是完美的正方形)。 生成导航控制器的代码如下: import UIKit class ViewController: UIViewController {

我已经将我的应用程序从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中everting是好的,而在Swift 4.0中everting是坏的


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

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

CustomNavigationController
中的
barImageView
barButton
应如下所示:

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)
}
您在带有信号强度的
标识中的
信号强度图标视图

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

在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,即使在真正的设备上也没有检查,一切都正常工作。谢谢你的帮助!谢谢你的帮助!