userInteractionEnabled = NO;除了一个子按钮

时间:2016-10-31 15:13:45

标签: ios objective-c

我正在尝试创建一个包含在UIViewController中的浮动按钮。 一个浮动按钮,如:https://material.google.com/components/buttons-floating-action-button.html#

但是,我怎样只让按钮响应触摸?

- (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;
}

更新:我添加了一个名为MyView的UIView子类,并添加了:

- (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)

1 个答案:

答案 0 :(得分:3)

这不起作用:

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

如果未启用self.view,则不会启用其子视图。 closeButton是其子视图。

但是,有一种解决方法。您为hitTest:withEvent:覆盖self.view以调用super并返回nil如果它收到的视图不是按钮,并且如果 则返回按钮按钮。现在只有按钮可以触摸。

如果你不想那样做,这里有一个更简单的方法:把一个几乎不可见的视图包含在所有内容前面的按钮,userInteractionEnabled等于true。几乎不可见的视图的背景颜色为alpha大于0 - 足以接收触摸,但不足以让用户看到它。现在触摸不会通过它,只有按钮是可点击的。 (或者让用户看到它!一个黑暗的半透明背景视图很正常 - 就像UIAlertController那样。)