[英]How to remove gesture recogniser
所以,我在覆蓋視圖中添加了一個手勢識別器。 當在屏幕上點擊時,我希望這個覆蓋到 go 之外。 話雖如此,添加手勢識別器會覆蓋“內部修飾”和其他按鈕單擊事件。 我需要這個,因此我需要刪除gesturerecognizer。 我可以使用這種方法,但是我有問題。 我的代碼如下 -
- (void)helpClicked
{
CGRect visibleBounds = [self convertRect:[self bounds] toView:viewContainer];
CGFloat minimumVisibleX = CGRectGetMinX(visibleBounds);
UIImageView * helpOverlay = [[UIImageView alloc]initWithFrame:CGRectMake(minimumVisibleX, 0, 1024, 768)];
UIImage * helpImage = [UIImage imageNamed:@"HelpOverLay.png"];
[helpOverlay setImage:helpImage];
helpOverlay.tag = 50;
self.scrollEnabled = NO;
[self addSubview:helpOverlay];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissView)];
[self addGestureRecognizer:tap];
}
在這里,我將覆蓋從另一個視圖中移除。
- (void) dismissView
{
UIView *overlay = [self viewWithTag:50];
[overlay removeFromSuperview];
self.scrollEnabled = YES;
}
我的問題是如何在第二種方法中刪除手勢識別器? 我不能將變量 tap 傳遞給這個方法,也不能在以前的方法中刪除它。 任何指針? 在事件方面,我遇到了很多傳遞變量問題。
此循環將刪除視圖具有的所有手勢識別器
for (UIGestureRecognizer *recognizer in self.view.gestureRecognizers) {
[self.view removeGestureRecognizer:recognizer];
}
在@interface
聲明一個ivar
UITapGestureRecognizer *tap
。
將helpClicked
更改為:
- (void)helpClicked
{
CGRect visibleBounds = [self convertRect:[self bounds] toView:viewContainer];
CGFloat minimumVisibleX = CGRectGetMinX(visibleBounds);
UIImageView * helpOverlay = [[UIImageView alloc]initWithFrame:CGRectMake(minimumVisibleX, 0, 1024, 768)];
UIImage * helpImage = [UIImage imageNamed:@"HelpOverLay.png"];
[helpOverlay setImage:helpImage];
helpOverlay.tag = 50;
self.scrollEnabled = NO;
[self addSubview:helpOverlay];
tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissView)];
[self addGestureRecognizer:tap];
}
和dismissView
:
for (UIGestureRecognizer *recognizer in self.view.gestureRecognizers) {
[self removeGestureRecognizer:tap];
}
編輯:我認為nhahtdh的方法比這個方法更優雅。
EDIT2:似乎你有[self addGestureRecognizer:tap]
工作,所以我認為這是UIView
的子類。
從WWDC 2015,Cocoa Touch最佳實踐 ,如果您以后需要訪問它,建議您保留一個屬性或iVar,並且不要使用viewWithTag:
.
這樣可以省去一些麻煩:
(即)您第一次使用標簽實現它,一切都按預期工作。 稍后你會處理另一個功能,讓我們打破這個功能並導致你不期望的不良行為。 Log不會給你一個警告,你可以得到最好的東西,這取決於發送到實例的崩潰信號無法識別的選擇器 。 有時你不會得到任何這些 。
聲明iVar
@implementation YourController {
UITapGestureRecognizer *tap;
}
設置您的視圖
- (void) helpClicked {
//Your customization code
//Adding tap gesture
tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissView)];
[self addGestureRecognizer:tap];
}
直接刪除手勢
- (void) dismissView {
[self.view removeGestureRecognizer:tap];
}
只需設置疊加視圖一次,設置手勢識別器,但隱藏疊加視圖。 隱藏視圖時,不會從用戶接收任何觸摸。 僅在必要時使疊加視圖對視圖可見,並在不需要時將其隱藏。
對於第二種方法,您的代碼應該看起來更像這樣:
- (void) dismissView {
UIView *overlay = [self viewWithTag:50];
for (UIGestureRecognizer *recognizer in self.view.gestureRecognizers) {
if([recognizer isKindOfClass:[UITapGestureRecognizer class]]) {
[self removeGestureRecognizer:recognizer];
}
}
[overlay removeFromSuperview];
self.scrollEnabled = YES;
}
我添加了對UITapGestureRecognizer
的檢查,以防你的類處理多個UIGestureRecognizer
並且你只想刪除它。
Swift版本:
if let recognizers = yourView.gestureRecognizers {
for recognizer in recognizers {
yourView.removeGestureRecognizer(recognizer)
}
}
這項工作對我來說:
for (UIGestureRecognizer *gr in self.view.gestureRecognizers) {
[self.view removeGestureRecognizer:gr];
}
如果您能夠擴展視圖,可以嘗試這種方式:
_ = gestureRecognizers.flatMap { $0.map { removeGestureRecognizer($0) } }
在Swift 4中
if let gestures = shotButton.gestureRecognizers //first be safe if gestures are there
{
for gesture in gestures //get one by one
{
shotButton.removeGestureRecognizer(gesture) //remove gesture one by one
}
}
漂亮的 Swifty 單線:
view?.forEach { view.removeGestureRecognizer($0) }
它對我有用。
while (view.gestureRecognizers.count) {
[view removeGestureRecognizer:[view.gestureRecognizers objectAtIndex:0]];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.