2017-09-13 172 views
0

在使用不同的帧和图像值返回到VC时调整UIBarButtonItem大小时遇到​​问题。对于selectedR = 1在Swift4中,替换navigationItem.leftBarButtonItem调整大小无用

编辑回viewDidLoad中具有不同的值selectedR和图像

var selectedR = 1 
var leftFrame = CGRect() 
var leftImage = UIImage() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    if selectedR == 0 
    { 
     leftFrame = CGRect(x: 0, y: 0, width: 33, height: 33) 
     leftImage = UIImage(named: “pic-0”)! 
    } 
    else if selectedR == 1 
    { 
     leftFrame = CGRect(x: 0, y: 0, width: 79, height: 33) 
     leftImage = UIImage(named: "pic-1")! 
    } 
    else if selectedR == 2 
    { 
     leftFrame = CGRect(x: 0, y: 0, width: 34, height: 33) 
     leftImage = UIImage(named: "pic-2”)! 
    } 

    let cButton = UIButton(frame: leftFrame) 
    cButton.setImage(leftImage, for: UIControlState()) 
    cButton.addTarget(self.revealViewController(), action: #selector(SWRevealViewController.revealToggle(_:)), for: .touchUpInside) 
    cButton.contentMode = UIViewContentMode.scaleAspectFit 
    let leftItem = UIBarButtonItem(customView: cButton) 
    self.navigationItem.leftBarButtonItem = leftItem 
} 

第一次完美的大小炸毁,扭曲和设置leftFrame尺寸不兑现。

这一切都在迅速3完美,但迅速4它遍布各地。任何帮助或建议将不胜感激。

+0

为什么viewDidLoad被多次调用? – beyowulf

+0

从我所知道的是我使用的框架(SWRevealViewController)是如何工作的。并且在Swift 3中工作得很完美。这就是说,很可能确实是这个问题。你怎么看? –

+1

我只是想确保你没有手动调用系统应该处理的'viewDidLoad'。我的猜测是iOS 10和11之间的一个主要变化是现在栏按钮项由自动布局引擎布置。然而,这种变化应该是向后兼容的。你可以试试'cButton.widthAnchor.constraint(equalToConstant:leftFrame.width).isActive = true; cButton.heightAnchor.constraint(equalToConstant:leftFrame.height).isActive = true'你可以在这里看到更多关于它的信息https://developer.apple.com/videos/play/wwdc2017/204/ – beyowulf

回答

1

iOS 10和11之间的一个主要变化是现在栏按钮项由自动布局引擎布置。通常应该向后兼容。但是,如果您在布置条形按钮项目时遇到问题,则应尝试设置约束条件并查看是否可以解决您的问题。

在你的情况下,你会说:

var selectedR = 1 
var leftFrame = CGRect() 
var leftImage = UIImage() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    if selectedR == 0 
    { 
     leftFrame = CGRect(x: 0, y: 0, width: 33, height: 33) 
     leftImage = UIImage(named: “pic-0”)! 
    } 
    else if selectedR == 1 
    { 
     leftFrame = CGRect(x: 0, y: 0, width: 79, height: 33) 
     leftImage = UIImage(named: "pic-1")! 
    } 
    else if selectedR == 2 
    { 
     leftFrame = CGRect(x: 0, y: 0, width: 34, height: 33) 
     leftImage = UIImage(named: "pic-2”)! 
    } 

    let cButton = UIButton(frame: leftFrame) 
    cButton.widthAnchor.constraint(equalToConstant: leftFrame.width).isActive = true 
    cButton.heightAnchor.constraint(equalToConstant: leftFrame.height).isActive = true 
    cButton.setImage(leftImage, for: UIControlState()) 
    cButton.addTarget(self.revealViewController(), action: #selector(SWRevealViewController.revealToggle(_:)), for: .touchUpInside) 
    cButton.contentMode = UIViewContentMode.scaleAspectFit 
    let leftItem = UIBarButtonItem(customView: cButton) 
    self.navigationItem.leftBarButtonItem = leftItem 
} 

这是覆盖在苹果的WWDC 2017年会议Updating Your App for iOS 11