2016-10-31 4 views
0

UIViewControllerにラップされたフローティングボタンを作成しようとしています。 フローティングボタンのように:https://material.google.com/components/buttons-floating-action-button.html#userInteractionEnabled = NO; 1つのサブボタンを除いて

しかし、ボタンだけがタッチに反応するようにすることはできますか?

- (void)viewDidLoad { 

    UIButton *closeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [closeButton addTarget:self 
        action:@selector(aMethod:) 
      forControlEvents:UIControlEventTouchDown]; 
    [closeButton setTitle:@"Back" 
       forState:UIControlStateNormal]; 
    closeButton.frame = CGRectMake(30.0, 30.0, 100.0, 30.0); 
    [self.view addSubview:closeButton]; 

    self.view.userInteractionEnabled = NO; 
    closeButton.userInteractionEnabled = YES; 
} 

更新:私はのUIViewのサブクラスを追加はMYVIEWと呼ばれ、追加:

self.view = [[MyView alloc] init]; 

のNSLogショー:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    UIView *hitTestView = [super hitTest:point withEvent:event]; 
    if (hitTestView == self) { 
     hitTestView = nil; 
    } 

    NSLog(@"%@", hitTestView); 

    return hitTestView; 
} 

とのViewControllerのviewDidLoadでは、最初の行としてこれを追加しましたいつも(ヌル)

+0

「フローティング」ボタンとは何ですか? – matt

+1

@matt OPは、closeButton以外のビュー全体を「無効にしたい」と思って、そのcloseButtonをユーザーが触れることのできない「背景」ビューの上に「フローティング」のように感じさせると思います。 – kennytm

+1

'pointInside:withEvent:'をオーバーライドすると、ポイントがボタン内にある場合にのみtrueを返すことができます。ボタンのスーパービューで 'userInteractionEnabled'をnoに設定すると、ボタンがタッチイベントを受け取らなくなります。 – dan

答えて

3

これはうまくいかないでしょう:

[self.view addSubview:closeButton]; 
self.view.userInteractionEnabled = NO; 
closeButton.userInteractionEnabled = YES; 

self.viewが有効でない場合、そのサブビューは有効ではありません。 closeButtonはそのサブビューです。

ただし、回避策があります。 self.viewhitTest:withEvent:をオーバーライドしてsuperを呼び出し、受信するビューがボタン以外の場合はnilを返し、ボタンがの場合はの場合はボタンを返します。今度はボタンだけが触れることができます。

これをやりたくない場合は、より簡単な方法です:がtrueに等しいすべてのものの前にボタンを含むほとんど目に見えないビューを配置します。ほとんど見えないビューはalphaの背景色を持ち、少し小さいは0より大きく、タッチを受け取るにはちょうど良いが、ユーザーが見ることができるほど十分ではありません。今触れても落ちず、ボタンだけがタップ可能です。 (または、ユーザーに見せてもらいましょう!)暗い半透明の背景ビューは、UIAlertControllerのように全く正常です。

+0

ありがとう、私はこれが行く方法だと確信しています - 私は私が押すビューを返すために "hitTest"を得ることができないので、質問を更新しました。 –

+0

あなたは 'userInteractionEnabled'をオンに戻さなかったので、 – matt

関連する問題