2017-09-13 9 views
0

フレームとイメージの値が異なるVCに戻すときにUIBarButtonItemのサイズ変更に問題が発生しました。 selectedR = 1Swift4で、navigationItem.leftBarButtonItemの置き換えにより不要なサイズが変更される

異なるselectedR値と画像と裏面のviewDidLoadに入ってくるため

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)の仕組みです。そして、スウィフト3で完璧に働いた。それは確かに非常によく問題になる可能性がある。あなたの考えは? –

+1

私は、あなたが手動で 'viewDidLoad'を呼び出すのではなく、システムが扱うべきものであることを確認したいだけです。私の推測は、iOS 10と11の間の大きな変化の1つで、自動レイアウトエンジンによってバーボタン項目が配置されています。その変更は下位互換性があるはずです。 '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の大きな変更の1つは、自動レイアウトエンジンによってレイアウトされたバーボタンアイテムです。通常、これは下位互換性があります。しかし、バーボタンアイテムのレイアウトに問題がある場合は、制約を設定して問題が解決するかどうかを確認する必要があります。

は、あなたの場合、あなたは言うでしょう:
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 
} 

この

は、AppleのWWDC 2017のセッション Updating Your App for iOS 11で覆われていました。

関連する問題