2017-09-08 9 views
29

iOS 11UIToolBarのサブビューでは、ボタンとテキストフィールドが応答しません。ビュー階層をiOS 10と比較すると、UIToolBarのすべてのサブビューにわたって_UIToolBarContentViewが存在することがわかります。例えばiOS11 UIToolBar Contentview

UIToolBar休憩slacktextviewcontroller https://github.com/slackhq/SlackTextViewController/issues/604

のこの新しいレイアウトはiOS 10/11で作業ソリューションが必要です。

+0

この問題を解決しましたか? – Tometoyou

+0

その奇妙だけど同じ問題を経験しましたが、いくつかのケースは見えません。 – REALFREE

+3

私はあなたのために質問を編集して閉じた状態から取り除こうとしました。改造者は私の編集内容を拒否しました。これは編集内容に回答を含めるためです。彼らは私がちょうど質問に答えるべきだと言いました。私はそれが閉じられている場合、質問に答えることはできません。とにかく、あなたの 'UIToolBar'の' layoutSubviews'メソッドをオーバーライドして、応答しないビューを前面に持って来るか、最後のビューをそのオーバーライドの裏に送ります。 –

答えて

27

(下のバージョンとの互換性)UIToolBarはUI階層にサブビューとして追加された後、あなたは唯一のlayoutSubview権利を作るために を必要としています。

この場合、_UIToolbarContentViewはUIToolBarの最初のサブビューに下がります。 は、前と同じようにすべてのサブビューを追加できます。 ObjCで例えば

UIToolbar *toolbar = [UIToolbar new]; 
    [self addSubview: toolbar]; 
    [toolbar layoutIfNeeded]; 

    <here one can add all subviews needed> 

同じ問題は、あなただけのhitTest(_:with:)メソッドを使用することができますslacktextviewcontroller

+3

インターフェイスビルダでビューを追加した場合はどうなりますか?それらを前面に送る以外の解決策はありますか? –

+0

ありがとうございます。同じ問題に直面していた。 – user1007522

+3

私はストーリーボードを使用してUIToolBarを追加しましたが、この問題を解決するにはどうすればいいですか? – anamika41

-2

これを行うには奇妙な方法があります。 iOS11のための問題を解決するために

[self.textInputbar sendSubviewToBack:[self.textInputbar.subviews lastObject]]; 
+0

"textInputbar"とは何ですか? – Mustard

+0

textInputbarはUIToolbarのオブジェクトです。 – user3077369

+0

これは、[github](https://github.com/slackhq/SlackTextViewController/issues/604)で説明されている解決策です。 – malex

1

で発生します。

  1. まず、UIToolbarで財産contentViewを作成します。

    open private(set) var contentView: UIView = UIView() 
    
  2. をその後、S 'UIToolbarと同じSフレーム' のcontentViewを作ります。たとえば:

    contentView.frame = bounds 
    contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight] 
    addSubview(contentView) 
    
  3. 最後に、hitTest(_:with:)方法オーバーライドします:あなたは、単に追加のビューを追加することにより、ツールバーをカスタマイズしたい場合は、このような状況では

    open override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { 
        if self.point(inside: point, with: event) { 
         if let hitTestView = contentView.hitTest(point, with: event) { 
          return hitTestView 
         } else { 
          return self 
         } 
        } else { 
         return nil 
        } 
    } 
    

を、あなたはそれらを追加する必要がありますcontentViewに転送され、適切に配置されます。

2

私の場合はこの問題を解決しました。私はUIToobarのサブクラスでlayoutSubviewsメソッドを書き換え、userInteractionEnable_UIToolbarContentViewに変更します。

- (void)layoutSubviews { 
    [super layoutSubviews]; 


    NSArray *subViewArray = [self subviews]; 

    for (id view in subViewArray) { 
     if ([view isKindOfClass:(NSClassFromString(@"_UIToolbarContentView"))]) { 
      UIView *testView = view; 
      testView.userInteractionEnabled = NO; 
     } 
    } 

} 
0

新しいUIToolbarオブジェクトは、積極的制約に基づいてレイアウトを使用していますので、- (void)updateConstraintsメソッドをオーバーライドすることをお勧めします。それをサブクラス化し、カスタムコンテナビューを追加することをお勧めしUIToolbarオブジェクトの上にカスタムビューを提示するには:

- (UIView *)containerView 
{ 
    if (_containerView) { 
     return _containerView; 
    } 
    _containerView = [[UIView alloc] initWithFrame:self.bounds]; 
    _containerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
    return _containerView; 
} 

今、あなたは安全にコンテナビューにカスタムビューを追加することができます。カスタムツールバーとUINavigationControllerを使用している場合、あなたはあなたのカスタムを追加する前に、レイアウトを更新することを強制する必要があること、

- (void)updateConstraints 
{ 
    [super updateConstraints]; 

    [self bringSubviewToFront:self.containerView]; 
} 

注:私たちは、制約を更新した後、ツールバーのサブビューの順序を変更する必要があるカスタムビューが応答ようにするにはサブビュー。