如何通过用户点击或在其他地方轻扫来删除UIView?

时间:2012-03-22 14:57:02

标签: ios objective-c uiview uigesturerecognizer touches

我已经在UIView中为iPhone创建了一个迷你弹出式菜单,我希望用户能够在除了选择其中一个选项之外的任何其他操作时解除该视图。因此,如果用户点击/滑动/捏住屏幕上的任何其他元素,弹出视图应该会消失。

然而,我不想检测出会阻止其他事情发生的手势...例如,下面有一个UITableView,如果我向上或向下滑动,我希望它按预期移动以及取消迷你弹出视图。

我应该使用多个手势识别器,还是应该使用touchesBegan,还是有更好的方法呢?

1 个答案:

答案 0 :(得分:2)

将其放入UIViewController

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    if (touch.view!=yourView && yourView) {
        [yourView removeFromSuperview];
        yourView=nil;
    }

}

编辑:为检测触摸而进行的更改,仅在视图存在时删除

EDIT2:您可以将以下内容添加到UIButtons/UITableView方法

 if (yourView) {
     [yourView removeFromSuperview];
     yourView=nil;
    }  

或将touchesBegan:withEvent:作为touchDown事件添加到按钮中。

两者都很烦人但却看不到另一种方法,因为touchesBegan方法不会被交互元素调用。

EDIT3:正确的废料,我认为我已经钉了它

在界面中

添加UIGestureRecognizerDelegate

@interface ViewController : UIViewController <UIGestureRecognizerDelegate> {

然后在viewDidLoad添加此

UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapMethod)];
tapped.delegate=self;
tapped.numberOfTapsRequired = 1;
[self.view addGestureRecognizer:tapped];

然后在你的viewController中添加这两个方法

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if (touch.view!=yourView && yourView) {
    return YES;
}
return NO;
}

-(void)tapMethod {
[yourView removeFromSuperview];
yourView=nil;
}