2013-04-08 49 views
2

在過去的四個小時裏,我嘗試了許多Stack Overlow解決方案,但沒有一個能幫助解決我的問題。使用UILongPressGestureRecognizer對UIScrollview的子視圖

這,

  • 我有一個的UIScrollView
  • 在這一滾動型有一個自定義的UILabel和8個自定義的UIImageViews
  • 我想檢測長按
  • 類似這樣的作品

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDidFire:)];
    longPress.minimumPressDuration = 0.5; [scroll addGestureRecognizer:longPress]; //scroll defined elsewhere

但是,如果我有滾動的任何子視圖代替滾動,長按事件永遠不會觸發。

  1. 我如何檢測滾動視圖的子視圖長按?
  2. 然而,這是一個非常混亂的黑客攻擊,因爲我可以檢測到長時間按下滾動視圖,有沒有什麼辦法可以檢測到新聞的 位置,以便我可以看到哪個特定的子視圖被 被按下。

此外,(insert subview here).userInteractionEnabled = YES,我將此屬性設置爲我的滾動視圖的所有子視圖,所以這不應該是一個問題。

我也嘗試過使用touchesBegan和touchesEnded方法,如Stack Overflow中其他地方所建議的。

另外,對於圖像的觀點,我不設置新的UILongPressGestureRecognizer對每個自定義圖像視圖,使用for循環,因爲我知道每個手勢識別規則1點看法。

從第一時間iOS開發,

格雷厄姆

附:我真的很喜歡,如果我能找到1的解決方案,而不是凌亂2.


更多的代碼的要求:

在視圖控制器

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDidFire:)]; 
longPress.minimumPressDuration = 0.5; 
[self.titleLabel addGestureRecognizer:longPress]; //titleLabel property initialized elsewhere 
[mainView addSubview:self.titleLabel]; 

的Init在 「負載圖像」 方法

for (NSData * dataImg in results) { 
//Does some work turning data into an image, into an image view called img 
     img.delegate = self; 
     img.userInteractionEnabled = YES; 
     UILongPressGestureRecognizer *aLongPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDidFire:)]; 
     aLongPress.minimumPressDuration = 0.5; 
     [img addGestureRecognizer:aLongPress]; 
     [imgContainer addSubview:img]; 
} 

更多代碼+筆記

自我。視圖(UIView的)

- >滾動(UIScrollView中)

- > - > MAINVIEW(UIView的)

- > - > - > titleLabel(的UILabel)

- > - > - > imgContainer(UIView的)

- > - > - > - >圖像(的UIImageViews)

[self.view addSubview:scroll]; 
[scroll addSubview:mainView]; 
[mainView addSubview:self.titleLabel]; 
[mainView addSubview:imgContainer]; 
[imgContainer addSubview:img]; //done 8x via for loop 

感謝@ RegularExpression的回答,我現在知道mainView被按下了,但不是它的子視圖,所以我需要找到一種方法來顯示mainView的子視圖。 :)

另一個更新,titleLabel的作品。 ImageViews仍然無法正常工作。 :(

+0

你如何在'UIScrollView'中添加'subViews'? – TheTiger 2013-04-08 04:15:15

+0

加載代碼,給我一個秒。謝謝您的幫助。 @TheTiger – GangstaGraham 2013-04-08 05:05:37

+0

對不起,我早先誤解了你,現在已經發布瞭如何添加視圖到我的滾動視圖@TheTiger – GangstaGraham 2013-04-08 06:02:05

回答

0

哇噢它的作品!

的問題是:

imgContainer是UIView的一個空框幾個UIImageViews的爲子視圖

我的印象是,作爲我添加了一個子視圖imgContainer,imgContainer將擴大

這是不是真的

我不得不將imgContainer的框架設置爲與滾動視圖相同的內容框架,然後一切都變好了。

我希望這個答案可以幫助像我這樣的其他未來的iOS冷杉定時器。

+0

就像你在玩一個遊戲:/首先,我們沒有你的代碼,我們只是回答你的問題。現在看看你的問題,任何人都可以給出答案,就像你在這裏給出的一樣?我認爲**沒有**,因爲你知道你寫了什麼....任何方式快樂編碼。 – TheTiger 2013-04-08 07:46:32

+0

我不是不清楚。所有人都做得很好,給了你什麼(雖然你基本上和我一樣有相同的代碼)。儘管如此,我還是覺得有必要給出最終的真實答案,以防將來遇到這個問題。 @老虎 – GangstaGraham 2013-04-08 08:01:43

0

而不是

[scroll addGestureRecognizer:longPress]; 

添加手勢在你的子視圖,右後聲明他們,你將它們添加之前滾動型

[subview addGestureRecognizer:longPress]; 
+1

我試過這個,不幸的是,它不起作用。 :P – GangstaGraham 2013-04-08 03:32:04

+0

^忘記在上面給你加上@mayuur – GangstaGraham 2013-04-08 03:35:02

+0

好的,你可以發表你如何在你的scrollview中添加視圖嗎? – mayuur 2013-04-08 03:35:33

1

由於您的UIScrollView是共同的父母,這是可能在你的手勢識別器需要的地方,你可以通過查看你的動作中提供的點的位置來確定哪個子視圖被按下,因此,各個子視圖不需要手勢識別器

所以,你會做這樣的事情:

- (void)longPressDidFire:(UILongPressGestureRecognizer *)sender 
{ 
    if (sender.state == UIGestureRecognizerStateEnded) 
     CGPoint point = [sender locationInView:scroll]; 
     UIView *tappedView = [scroll hitTest:point withEvent:nil]; 

,那麼你有一個很長按壓的觀點。

其他可能導致操作不會觸發的事情將是委託問題,或者如果滾動包含在另一個攔截觸摸的視圖中。

HTH

+0

這似乎很有趣,@RegularExpression,我會檢查出來 – GangstaGraham 2013-04-08 05:12:59

+0

但是,你會如何找到特定的UIView,它給出的內存分配,因爲有8個自定義UIImageViews,我不知道這是否會工作。 – GangstaGraham 2013-04-08 06:26:08

+0

謝謝,這幫助我弄清楚mainView被挖掘,但不是mainView的子視圖。這很有幫助! – GangstaGraham 2013-04-08 06:28:44

1

你的代碼似乎要被罰款,它應該工作我think.i使用下面的代碼和它的工作對我來說很好。

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; 
longPress.delegate = (id)self; 
longPress.minimumPressDuration=0.05; 
imageView.userInteractionEnabled = YES; 
[imageView addGestureRecognizer:longPress]; 

及其方法,

- (IBAction)handleLongPress:(UILongPressGestureRecognizer *)sender { 
    NSLog(@"detected"); 

if (sender.state == UIGestureRecognizerStateEnded){ 
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Alert" message:@"YES" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
    [alert show]; 
    } 
} 

在這裏,我把imageview的滾動視圖作爲子視圖爲u說

+0

謝謝,我上面發佈了我的代碼,它和你的非常相似,除了(id)self之外。但不幸的是,它不起作用。 @murali – GangstaGraham 2013-04-08 05:10:23

+0

如何添加subview jst你能告訴我嗎? – iSpark 2013-04-08 05:13:11

+0

對不起,我誤解你之前,現在已經發布如何添加視圖到我的滾動視圖@murali – GangstaGraham 2013-04-08 06:01:09

7

我知道這有點晚,已經選擇了一個答案,但如果你有iOS7的話,如果別人想要一個很好的簡單解決方案。

裏面你的UILongPressGestureRecognizer的委託實施gestureRecognizer:shouldRequireFailureOfGestureRecognizer:otherGestureRecognizer選擇

檢查otherGestureRecognizerUIPanGestureRecognizer並返回YES,否則返回NO

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { 
     return YES; 
    } 

    return NO; 
} 

滾動視圖實際上會生成一個UIScrollViewPanGestureRecognizer,它是私有API的一部分,但是它是UIPanGestureRecognizer的一個子類,因此上述工作正常。

支持iOS6的或以下,那麼你會通過的UIScrollView的gestureRecognizers需要循環,檢測其中一個是UIPanGestureRecognizer並在您UILongPressGestureRecogizer執行requireGestureRecognizerToFail選擇這一點。