簡體   English   中英

如何刪除手勢識別器

[英]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: .

Moto:屬性而不是Tags

這樣可以省去一些麻煩:

  1. 處理多個手勢時,您可以直接刪除所需的手勢並刪除它。 (無需迭代所有視圖的手勢以獲取正確的手勢)
  2. 在迭代時通過標記查找正確的手勢,如果在視圖上有多個標記,並且與特定標記發生沖突,則會產生誤導

(即)您第一次使用標簽實現它,一切都按預期工作。 稍后你會處理另一個功能,讓我們打破這個功能並導致你不期望的不良行為。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM