簡體   English   中英

如何檢測 UIImageView 的觸摸事件?

[英]How can I detect the touch event of an UIImageView?

我在導航欄上放置了一個圖像(UIImageView)。 現在我想檢測觸摸事件並想要處理該事件。 我怎樣才能做到這一點?

實際上,不要那樣做。

而是在 UIImageView 上添加一個具有自定義樣式的按鈕(除非您指定圖像,否則沒有按鈕圖形)。 然后附加任何你想調用的方法。

您可以在許多情況下使用該技術,在這種情況下,您確實希望屏幕的某些區域充當按鈕而不是弄亂 Touch 的東西。

UIImageView派生自UIView派生自UIResponder因此它已准備好處理觸摸事件。 您需要提供touchesBegantouchesMovedtouchesEnded方法,如果用戶點擊圖像,它們將被調用。 如果您想要的只是點擊事件,那么使用自定義按鈕並將圖像設置為按鈕圖像會更容易。 但是如果你想對點擊、移動等進行更精細的控制,這就是要走的路。

您還需要查看更多內容:

  • 覆蓋canBecomeFirstResponder並返回 YES 表示該視圖可以成為觸摸事件的焦點(默認為 NO)。

  • userInteractionEnabled屬性設置為 YES。 UIViews的默認值為 YES,但UIImageViews的默認值為 NO,因此您必須明確打開它。

  • 如果您想響應多點觸控事件(即捏合、縮放等),您需要將multipleTouchEnabled設置為 YES。

要將觸摸事件添加到 UIImageView,請在 .m 文件中使用以下內容:

UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];

[myImageView setUserInteractionEnabled:YES];

[myImageView addGestureRecognizer:newTap];


-(void)myTapMethod{
    // Treat image tap
}

您還可以添加 UIGestureRecognizer。 它不需要您在視圖層次結構中添加額外的元素,但仍然為您提供所有編寫精美的代碼,用於使用相當簡單的界面處理觸摸事件:

    UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
    [imgView_ addGestureRecognizer:swipeRight];        
    [swipeRight release];
    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    [imgView_ addGestureRecognizer:swipeLeft];
    [swipeLeft release];

在過去的幾個小時里,我一直在不同的線程上試圖為我的問題找到解決方案,但無濟於事。 我看到許多開發人員都有這個問題,我認為這里的人都知道這一點。 我在UIScrollView有多個圖像,試圖在它們上獲取點擊事件。

我沒有從UIImangeView獲得任何事件,但我確實從類似的UILable獲得了一個事件,該事件的參數非常相似,我設置了它。 在 iOS 5.1 下。

我已經做了以下事情:

  1. 將`UIImageView 和父視圖的setUserInteractionEnabled 設置為YES。
  2. UIImageView setMultipleTouchEnabled 設置為 YES 。
  3. 嘗試子類化UIImageView ,沒有任何幫助。

下面附上一些代碼,在這段代碼中,我初始化了UIImageViewUILabel ,標簽在觸發事件方面工作正常。 我嘗試保留不相關的代碼。

UIImageView *single_view = [[UIImageView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)];
single_view.image = img;
single_view.layer.zPosition = 4;

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
[single_view addGestureRecognizer:singleTap];
[single_view setMultipleTouchEnabled:YES];
[single_view setUserInteractionEnabled:YES];
[self.myScrollView addSubview:single_view];
self.myScrollView.userInteractionEnabled = YES;

UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
testLabel.backgroundColor = [UIColor redColor];
[self.myScrollView addSubview:testLabel];
[testLabel addGestureRecognizer:singleTap];
[testLabel setMultipleTouchEnabled:YES];
[testLabel setUserInteractionEnabled:YES];
testLabel.layer.zPosition = 4;

以及處理事件的方法:

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{
    UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil];
    NSLog(@"Touch event on view: %@", [tappedView class]);
}

如上所述,接收到標簽抽頭。

與其制作可觸摸的 UIImageView,然后將其放置在導航欄上,不如創建一個 UIBarButtonItem,它由 UIImageView 制作。

首先制作圖像視圖:

UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];

然后從圖像視圖中制作 barbutton 項目:

UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];

然后將欄按鈕項添加到導航欄:

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

請記住,此代碼進入導航控制器視圖控制器數組內的視圖控制器。 所以基本上,這個“可觸摸的圖像欄按鈕項”只會在顯示此視圖控制器時出現在導航欄中。 當您按下另一個視圖控制器時,此導航欄按鈕項將消失。

您可能想要覆蓋包含UIImageView子視圖的UIView (或子類)的touchesBegan:withEvent:方法。

在這個方法中,測試是否有任何UITouch觸摸落在UIImageView實例的邊界內(假設它被稱為imageView )。

也就是說, CGPoint元素[touch locationInView]CGRect元素[imageView bounds] CGRect [imageView bounds]相交? 查看函數CGRectContainsPoint以運行此測試。

首先,您應該放置一個 UIButton,然后您可以為此按鈕添加背景圖像,或者您需要在按鈕上放置一個 UIImageView。

或者:

您可以將點擊手勢添加到 UIImageView,以便在點擊 UIImageView 時獲得點擊動作。

對於那些正在尋找針對此答案的 Swift 4 解決方案的人,您可以使用以下內容來檢測 UIImageView 上的觸摸事件。

let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true

然后,您需要按如下方式定義選擇器:

@objc func imageViewTapped() {
    // Image has been tapped
}

在該視圖上添加手勢。 將圖像添加到該視圖中,然后它也會檢測圖像上的手勢。 您可以嘗試使用觸摸事件的委托方法。 那么在這種情況下,它也可能正在檢測。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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