1

iOS 11以来、、setRightBarButtonItems(_, animated:)setLeftBarButton(_, animated:)setRightBarButton(_, animated:)の各メソッドでは、animatedのパラメータが無視されているようです。iOS 11で動作しないアニメーションのUIBarButtonItemを設定する

私はUIViewControllerサブクラスのこの単純なコードを作った:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let rightButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(changeRightBarButtonItem(_:))) 
    navigationItem.rightBarButtonItem = rightButton 
} 

@objc 
func changeRightBarButtonItem(_ sender: Any) { 
    let newRightButton = UIBarButtonItem(title: "Cancel", style: .plain, 
              target: self, action: #selector(changeRightBarButtonItem(_:))) 
    navigationItem.setRightBarButtonItems([newRightButton], animated: true) 
} 

iOSの10で期待どおりにこれが実行されているが、iOSの11にanimatedtruefalseであるかどうか違いはありません。

iOS 11のようだが、多分私は何かを逃した。それを動作させるためのヒント?回避策でさえ面白いでしょう。

+0

あなたは、IOS 10でアニメーションを示してgifファイルを追加しましたので、我々は簡単にあなたの問題 –

+0

は、あなたがそれを解決しなかった理解することができますか? –

+0

いいえ、iOS 11.2 betaのシミュレータで再び動作します。私はまだデバイス上でテストしていません。 – Sparga

答えて

0

これは、iOS 11 navbarの実装のバグであるようです。

引用:

これらsetLeftBarButtonItem:animated:setRightBarButtonItem:animated:setLeftBarButtonItems:animated:、およびsetRightBarButtonItems:animated:が実際にアニメーション化されていない項目すべてで。

iOS 11実装のバグだと思います。これらのmtehodからの呼び出しのチェーンでは、一様にupdateTopNavigationItemAnimated:を呼び出すため、現在の実装はこれと似ています。

-[_UINavigationBarVisualProviderModernIOS updateTopNavigationItemAnimated:]: 
0000000000be5708   push  rbp 
; Objective C Implementation defined at 0x13ff050 (instance method), DATA XREF=0x13ff050 
0000000000be5709   mov  rbp, rsp 
0000000000be570c   mov  rsi, qword [0x147f030] 
; @selector(setupTopNavigationItem), argument "selector" for method _objc_msgSend 
0000000000be5713   pop  rbp 
0000000000be5714   jmp  qword [_objc_msgSend_11195c8] 
; _objc_msgSend 

Obvisouly、この方法は、アニメーションの引数を与えられ、単に任意のarugmentsを負いませんsetupTopNavigationItemを呼び出し無視します。したがって、この時点でアニメーションフラグは無視されます。

この実装のため、UIBarButtonが押された状態のままになることがあります。

出典:https://gist.github.com/niw/569b49648fcab22124e1d12c195fe595

関連する問題