2016-10-31 74 views
0

我想創建一個包裹在UIViewController中的浮動按鈕。 像這樣的浮動按鈕:https://material.google.com/components/buttons-floating-action-button.html#userInteractionEnabled = NO;除了一個子按鈕

但是我怎樣才能讓按鈕響應觸摸?

- (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的和補充:

- (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中加入此作爲第一行:

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

的NSLog的節目始終(null)

+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是它的子視圖。

但是,有一種解決方法。您覆蓋hitTest:withEvent:self.view致電超級並返回nil如果它收到的視圖除了按鈕以外任何東西,並且返回按鈕如果它是按鈕。現在只有按鈕是可觸摸的。

如果你不想這樣做,這裏有一個更簡單的方法:將包含按鈕的幾乎不可見的視圖放在所有內容的前面,userInteractionEnabled等於true。幾乎不可見的視圖有一個背景色,alpha大於0 - 只是足以接收觸摸,但不足以讓用戶看到它。現在觸摸不會通過它,只有按鈕可點擊。 (或讓用戶看到它!一個黑暗的半透明背景視圖非常正常 - 就像UIAlertController所做的一樣)。

+0

謝謝,我相信這是要走的路 - 我更新了這個問題,因爲我無法獲得「hitTest」來返回我按下的視圖。 –

+0

因爲你沒有打開'userInteractionEnabled'嗎? – matt

相關問題