当用户点击视图外的任何位置时,关闭视图

时间:2013-04-16 10:41:31

标签: ios cocoa-touch uiview

我有一个非常复杂的应用程序,有很多堆叠视图,包含许多按钮,绘图区域和其他自定义触摸处理。我正在显示一个可拖动的帮助器视图,它可以位于所有其他视图之上。如果用户点击辅助视图之外的任何地方,我需要忽略此视图。我尝试过使用多个UIWindows并在UIWindow中添加Gesture识别器。

3 个答案:

答案 0 :(得分:15)

一个简单的方法就是添加一个透明按钮,其边界等于superview的界限。并且superview在帮助器视图下方插入透明按钮。

透明按钮添加一个点击事件,可以解除帮助视图和它自己的透明按钮。

例如:

UIButton *transparencyButton = [[UIButton alloc] initWithFrame:superview.bounds];
transparencyButton.backgroundColor = [UIColor clearColor];
[superview insertSubview:transparencyButton belowSubview:helperView];
[transparencyButton addTarget:self action:@selector(dismissHelper:) forControlEvents:UIControlEventTouchUpInside];

并且dismissHelper:方法可以执行此操作:

- (void)dismissHelper:(UIButton *)sender
{
    [helperView dismiss];
    sender.hidden = YES;
    // or [sender removeFromSuperview]
}

答案 1 :(得分:8)

您可以通过触摸并查看触摸的.view属性来检查被触摸的视图。它反映了视图实际来源的视图。

假设您将视图(通过IBOutlet或其他方式)引用到名为“myView”的视图,则以下内容有效。

在.m文件中。每次用户触摸手指时触发touchesBegan:function。我们遍历触摸以查看触摸的原始视图是否不等于“myView”。也可以通过检查用于标识视图的类,标记或任何其他属性来完成此比较。下面给出的例子。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  {
    NSLog(@"touches began");
    UITouch *touch = [touches anyObject];   
    if(touch.view!=myView){
       myView.hidden = YES;
    }
}

或者在使用标签的情况下:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  {
    NSLog(@"touches began");
    UITouch *touch = [touches anyObject];   
    if(touch.view.tag!=23){
       myView.hidden = YES;
    }
}

答案 2 :(得分:1)

创建一个hittestintercept视图。这可以使下面的视图像以前一样处理事件。

@protocol HitTestInterceptViewDelegate <NSObject>

- (BOOL)interceptHitTest:(CGPoint)point withEvent:(UIEvent *)event;

@end

@interface HitTestInterceptView : UIView

@property(nonatomic, weak) id<HitTestInterceptViewDelegate> hitTestInterceptDelegate;

@end

HtiTestInterceptView.m

import&#34; HitTestInterceptView.h&#34;

@implementation HitTestInterceptView

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if ([_hitTestInterceptDelegate interceptHitTest:point withEvent:event] == NO) {
        return [super hitTest:point withEvent:event];
    }
    return nil;
}

@end

然后在吐司视图中使用它

- (void)dismissIfTouchOutsideInView:(UIView *)view {
    if (_interceptView != nil) return;
    _interceptView = [[HitTestInterceptView alloc] initWithFrame:view.bounds];
    _interceptView.backgroundColor = [UIColor clearColor];
    _interceptView.hitTestInterceptDelegate = self;
    [view insertSubview:_interceptView belowSubview:self];
}

- (BOOL)interceptHitTest:(CGPoint)point withEvent:(UIEvent *)event {
    dispatch_async(dispatch_get_main_queue(), ^{
        // [self dismiss];
    });
    return YES;
}