User interface 从Swift 3迁移到Swift 4导航栏断开的界面
我已经将我的应用程序从Swift 3.1迁移到Swift 4.0(从Xcode 8.3.3迁移到Xcode 9.0),我的部分界面现在已经损坏。导航控制器的导航栏已完成。请看截图: 有3个要素: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 {
- 左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,即使在真正的设备上也没有检查,一切都正常工作。谢谢你的帮助!谢谢你的帮助!