在外面轻敲时删除视图

我有一个UIView,当我点击一个button时出现,我基本上是使用它作为一个自定义的警报视图。 现在,当用户点击我添加到主视图的自定义UIView之外时,我想要隐藏cusomt视图,我可以轻松地使用customView.hidden = YES; 但是如何检查视图外的水龙头呢?

谢谢您的帮助

有两种方法:

第一种方法:

您可以为自定义视图设置标签:

 customview.tag=99; 

然后在你的viewcontroller中,使用touchesBegan:withEvent: delegate

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch = [touches anyObject]; if(touch.view.tag!=99){ customview.hidden=YES; } } 

第二种方法:

每当你想要popup一个自定义的视图时,总是会有一个覆盖图,它会填满你的屏幕(例如alpha〜0.4的黑色视图)。 在这些情况下,您可以添加一个UITapGestureRecognizer ,并在每次希望显示自定义视图时将其添加到视图中。 这是一个例子:

 UIView *overlay; -(void)addOverlay{ overlay = [[UIView alloc] initWithFrame:CGRectMake(0, 0,self.view.frame.size.width, self.view.frame.size.height)]; [overlay setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5]]; UITapGestureRecognizer *overlayTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onOverlayTapped)]; [overlay addGestureRecognizer:overlayTap]; [self.view addSubview:overlay]; } - (void)onOverlayTapped { NSLog(@"Overlay tapped"); //Animate the hide effect, you can simple use customview.hidden=YES; [UIView animateWithDuration:0.2f animations:^{ overlay.alpha=0; customview.alpha=0; }completion:^(BOOL finished) { [overlay removeFromSuperview]; }]; } 

当您呈现自定义警报视图时,将该自定义警报视图添加到另一个全屏视图中,通过将其backgroundColor clear设置为清除该视图。 在主视图中添加全屏视图,并在fullScreen不可见视图中添加tapGesture ,当它获得点击删除此视图。

但是,如果您要这样做,即使您触摸自定义警报视图,也会忽略视图,因为您需要设置tapGesture并实施此方法

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isDescendantOfView:self.customAlertView]) { return NO; } return YES; } 

在Swift中使用函数pointInside:

 override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { if let view = customView { //if UIView is open open let newPoint = self.convertPoint(point, toView: view) let pointIsInsideGenius = view.pointInside(newPoint, withEvent: event) // tapping inside of UIView if pointIsInsideGenius { return true } else { // if tapped outside then remove UIView view.removeFromSuperview() view = nil } } } return false } 

我真的很喜欢使用KLCPopuo库(在github上很容易find),它为你做了一切。

你给它一个观点,它会显示它,animation,解雇它,而且更多。 查找并使用它:)

如果你不想这样做,你可以看看UIAlertController的子类,以便将它转换成精确的警报需求。

就像在FlySoFast的答案中,我尝试了第一种方法,它的工作,我刚分享到它的迅速版本。 你可以标记你的自定义视图,并检查该视图是否触及,所以我们实现了我的解决scheme。在下面,我将自定义视图的标记值赋值为900。

 customview.tag = 900 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { let touch = touches.first! if touch.view?.tag != 900 { resetMenu() } } 

我希望这个答案对你有帮助