2013-10-18 65 views
1

我有一個全屏UIScrollView,它根據當前滾動位置執行自定義操作。在一個放置在它上面的圖層上,但是它不在同一個層次結構中,我有一個UIImageView,它有一個輕擊手勢識別器,它將控制權發送給給定的選擇器。將事件傳遞給iOS中的另一個對象Objective C

我的目標會是這樣:

  • 如果用戶點擊的UIImageView點擊手勢識別如果用戶或其他地方的屏幕UIScrollView的委託上刷卡上下運行選擇器(這種情況)
  • 執行它的魔力(這也恰好)
  • 如果用戶啓動刷卡(滾動)從UIImageView的,該事件被傳遞給UIScrollView的(這不會發生)

我知道這可以實現如果UIImageView是UIScrollView的子視圖,但我想避免這種情況,因爲UIImageView不打算用UIScrollView的內容滾動。無論如何,我可以將UIImageView中的「滾動」觸摸事件傳遞給UIScrollView對象,而不是使其成爲滾動視圖的子視圖?

回答

0

我想提出以下解決方案。

AIImageView.m:

#import "AIImageView.h" 

@implementation AIImageView 
{ 
    NSInteger _cnt; 
} 

- (id)initWithImage: (UIImage*)image 
{ 
    if ((self = [super initWithImage:image])) 
    { 
     [self setUserInteractionEnabled: YES]; 

     UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc] initWithTarget: self 
                        action: @selector(handleTapGesture:)]; 
     tapGesture.delegate = self; 
     [self addGestureRecognizer: tapGesture]; 

     _cnt = 0; 
    } 
    return self; 
} 

- (UIView*) hitTest: (CGPoint) point withEvent: (UIEvent*) event 
{ 
    CGPoint result = [self convertPoint: point toView: self.scrollView]; 

    _cnt++; 

    if (CGRectContainsPoint(self.frame, result)) 
    { 
     if (_cnt > 2) 
     { 
      _cnt = 0; 
     } 
     else 
     { 
      return self.scrollView; 
     } 
    } 

    return [super hitTest: point withEvent: event]; 
} 

- (void) handleTapGesture: (id) sender 
{ 
    NSLog(@"TAP!!!"); 
} 

@end 

AIImageView.h:

#import <UIKit/UIKit.h> 

@interface AIImageView : UIImageView <UIGestureRecognizerDelegate> 

@property(nonatomic, strong) UIScrollView* scrollView; 

@end 

創建的ImageView:

UIImage* image = [UIImage imageNamed: @"default_cover.png"]; 
imageView = [[AIImageView alloc] initWithImage: image]; 
imageView.frame = CGRectMake(100, 400, 100, 100); 
imageView.scrollView = self.scrollView; 
[self.view addSubview: imageView]; 

如果你會嘗試它,你可以看到這個解決方案的工作,但不總是:)。但我相信它可以幫助你。

+0

這會使圖像視圖無法點擊。 –

+0

我更新了我的答案 – stosha

+0

與上面的解決方案一樣,從我的測試看來,這隻有在UIImage是UIScrollView的子視圖時纔有效。我試圖避免這一點,但我想這似乎是不可避免的。 – Aron

2

您可以在圖像視圖的輕觸手勢識別器上使用requireGestureRecognizerToFail:來傳遞滾動視圖的平移手勢識別器。如果滾動視圖的手勢識別器不接受事件,這應該只激活輕擊手勢識別器。

+0

這似乎是最好的解決方案。但不應該這個工作(它不是因爲某種原因)?它確實沒問題,scrollView不是imageLogo的超級視圖嗎? UITapGestureRecognizer * tapLogo = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOnLogo :)]; [tapLogo requireGestureRecognizerToFail:self.scrollView.panGestureRecognizer]; [self.imageLogo addGestureRecognizer:tapLogo]; – Aron

+0

@Aron嗯,也許這是不可能的,如果視圖不是滾動視圖的子視圖。但爲什麼不把它添加到層次結構中呢?即使滾動滾動視圖,您也可以輕鬆地將其鎖定到位。 –

+0

是的,我想我會這樣做,因爲我發現沒有辦法解決層次結構問題。我想避免移動對象,假設數學很容易,它會有性能影響。我們拭目以待... – Aron

相關問題