简体   繁体   English

iOS确保Bar Button项目在iPhone SE的UINavigationBar中显示为全尺寸

[英]iOS Ensure Bar Button Items Appear Full-Size in UINavigationBar on iPhone SE

In my app, I have a navigation bar where I'm using three buttons on the right side. 在我的应用程序中,我有一个导航栏,在其中使用了右侧的三个按钮。 I create it like this: 我这样创建它:

let button1 = UIBarButtonItem(image: UIImage(named: "button1"),
                              style: .plain,
                              target: self,
                              action: #selector(self.button1Tapped))

// Repeat for button2 and button3

navigationItem.rightBarButtonItems = [button1, button2, button3]

This works as expected, except on iPhone SE. 除iPhone SE以外,这可以按预期工作。 It seems like there is some sort of fixed limit on what percentage of the navigation bar width the right bar buttons can take up, and this limit is exceeded on the small screen of the iPhone SE. 似乎对右侧栏按钮可以占据导航栏宽度的百分比有某种固定的限制,而在iPhone SE的小屏幕上已经超过了此限制。 So, the rightmost button gets shrunk down to about half the size of the other buttons. 因此,最右边的按钮缩小到其他按钮大小的一半。

I'm not setting a title, so there's more than enough space for all 3 buttons to be full size - even on iPhone SE. 我没有设置标题,所以所有3个按钮都有足够的空间来放大,即使在iPhone SE上也是如此。 However, I'm not sure how to specify that in code; 但是,我不确定如何在代码中指定它。 is there some way to increase this limit (or whatever feature causes the button to shrink) to ensure that all of the BarButtonItems appear full size on iPhone SE? 有什么方法可以增加此限制(或任何导致按钮缩小的功能),以确保所有BarButtonItem在iPhone SE上显示为完整尺寸?

This isn't the most eloquent way of doing things but it should work. 这不是最有说服力的做事方式,但应该可以。

The iPhone SE screen's dimensions are w:320 xh:568 Apple Screen Display Sizes iPhone SE屏幕的尺寸为w:320 xh:568 Apple屏幕显示尺寸

You could possibly resize the images for the iPhone SE and do something like this: 您可以为iPhone SE调整图像大小并执行以下操作:

var button1: UIBarButtonItem!
var button2: UIBarButtonItem!
var button2: UIBarButtonItem!

// check the screen's dimensions
if UIScreen.main.bounds.width == 320 && UIScreen.main.bounds.height == 568{

    // you may have to play around with it but resize the UIImage(named: "button1") to fit the iPhone SE
    button1 = UIBarButtonItem(image: UIImage(named: "button1_Resized"),
                              style: .plain,
                              target: self,
                              action: #selector(self.button1Tapped))

    // Repeat for button2 and button3
    // resize the UIImage(named: "button2_Resized") and UIImage(named: "button3_Resized") to fit the iPhone SE

} else{

    // anything other then the iPhone SE will get the regular sized images
    button1 = UIBarButtonItem(image: UIImage(named: "button1"),
                              style: .plain,
                              target: self,
                              action: #selector(self.button1Tapped))

    // Repeat for button2 and button3
}

navigationItem.rightBarButtonItems = [button1, button2, button3]

You can declare these properties 您可以声明这些属性

let contentView = UIView()
let buttonOneImageView = UIImageView()
let buttonTwoImageView = UIImageView()
let buttonThreeImageView = UIImageView()

assign a UIView to titleView property of navigationItem of ViewController as a workaround 将UIView分配给ViewControllernavigationItem的titleView属性作为解决方法

fileprivate func buttonOneImageViewConstraints() {
    buttonOneImageView.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
    buttonOneImageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
    buttonOneImageView.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: -8).isActive = true
    buttonOneImageView.widthAnchor.constraint(equalTo: buttonOneImageView.heightAnchor).isActive = true
}

fileprivate func buttonOneConstraints(_ button1: UIButton) {
    //button1 constraints
    button1.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
    button1.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
    button1.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: -8).isActive = true
    button1.widthAnchor.constraint(equalTo: button1.heightAnchor).isActive = true
}

fileprivate func buttonTwoImageViewConstraints() {
    buttonTwoImageView.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
    buttonTwoImageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
    buttonTwoImageView.rightAnchor.constraint(equalTo: buttonOneImageView.leftAnchor, constant: -8).isActive = true
    buttonTwoImageView.widthAnchor.constraint(equalTo: buttonTwoImageView.heightAnchor).isActive = true
}

fileprivate func buttonTwoConstraints(_ button1: UIButton,_ button2: UIButton) {
    //button2 constraints
    button2.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
    button2.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
    button2.rightAnchor.constraint(equalTo: button1.leftAnchor, constant: -8).isActive = true
    button2.widthAnchor.constraint(equalTo: button2.heightAnchor).isActive = true
}

fileprivate func buttonThreeImageViewConstraints() {
    buttonThreeImageView.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
    buttonThreeImageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
    buttonThreeImageView.rightAnchor.constraint(equalTo: buttonTwoImageView.leftAnchor, constant: -8).isActive = true
    buttonThreeImageView.widthAnchor.constraint(equalTo: buttonThreeImageView.heightAnchor).isActive = true
}

fileprivate func buttonThreeConstraints(_ button2: UIButton,_ button3: UIButton) {
    //button3 constraints
    button3.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
    button3.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
    button3.rightAnchor.constraint(equalTo: button2.leftAnchor, constant: -8).isActive = true
    button3.widthAnchor.constraint(equalTo: button3.heightAnchor).isActive = true
}

fileprivate func contentViewConstraints(_ titleView: UIView) {
    //setting constraints for contentView
    contentView.rightAnchor.constraint(equalTo: titleView.rightAnchor).isActive = true
    contentView.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width).isActive = true
    contentView.centerXAnchor.constraint(equalTo: titleView.centerXAnchor).isActive = true
    contentView.centerYAnchor.constraint(equalTo: titleView.centerYAnchor).isActive = true
    self.navigationItem.titleView = titleView
}

func setupNavBar() {

    contentView.backgroundColor = .black
    contentView.translatesAutoresizingMaskIntoConstraints = false

    let titleView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 40))
    titleView.addSubview(contentView)


    buttonOneImageView.translatesAutoresizingMaskIntoConstraints = false
    buttonOneImageView.contentMode = .scaleAspectFit
    buttonOneImageView.image = #imageLiteral(resourceName: "contacts-settings")
    contentView.addSubview(buttonOneImageView)

    //add button1
    let button1 = UIButton(type: .roundedRect)
    button1.translatesAutoresizingMaskIntoConstraints = false
    button1.addTarget(self, action: #selector(buttonOneFunction), for: .touchUpInside)
    contentView.addSubview(button1)

    buttonTwoImageView.translatesAutoresizingMaskIntoConstraints = false
    buttonTwoImageView.contentMode = .scaleAspectFit
    buttonTwoImageView.image = #imageLiteral(resourceName: "contacts-history")
    contentView.addSubview(buttonTwoImageView)

    //add button2
    let button2 = UIButton(type: .roundedRect)
    button2.translatesAutoresizingMaskIntoConstraints = false
    button2.addTarget(self, action: #selector(buttonTwoFunction), for: .touchUpInside)
    contentView.addSubview(button2)

    buttonThreeImageView.translatesAutoresizingMaskIntoConstraints = false
    buttonThreeImageView.contentMode = .scaleAspectFit
    buttonThreeImageView.image = #imageLiteral(resourceName: "contacts-person")
    contentView.addSubview(buttonThreeImageView)

    //add button3
    let button3 = UIButton(type: .roundedRect)
    button3.translatesAutoresizingMaskIntoConstraints = false
    button3.addTarget(self, action: #selector(buttonThreeFunction), for: .touchUpInside)
    contentView.addSubview(button3)


    DispatchQueue.main.asyncAfter(deadline: .now()) {
        self.buttonOneImageViewConstraints()
        self.buttonOneConstraints(button1)
        self.buttonTwoImageViewConstraints()
        self.buttonTwoConstraints(button1, button2)
        self.buttonThreeImageViewConstraints()
        self.buttonThreeConstraints(button2, button3)
        self.contentViewConstraints(titleView)
    }

}

Similarly, 同样的,

@objc func buttonTwoFunction() {
    print("button 2 tapped")
}

@objc func buttonThreeFunction() {
    print("button 3 tapped")
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM