2012-07-16 96 views
3

我有一個UIViewView裏面的UIScrollView,裏面的UIView是一個按鈕。問題是,當我按下該按鈕時,按住它(在這種情況下,按鈕狀態被按下)並嘗試滾動,我的滾動視圖不滾動。應該在哪。 UIView中有一個手勢識別器,我試圖用它的一個委託來讓滾動視圖滾動,如果我用手按下UIButton並滾動。我該怎麼做呢?允許UIScrollView滾動時按下UIButton

基本上總結一下,如果按下按鈕,我需要將觸摸事件傳遞給滾動視圖。如果它是來自按鈕的觸摸事件,那麼顯然它應該觸發按鈕的動作而不滾動。

+1

這可能是更容易在您的按鈕添加選擇的UIControlEvent:UIControlEventTouchUpInside – 2012-07-16 15:30:31

+0

@Rickay我增加了更多的上下文上面的問題,可能有助於澄清 – xonegirlz 2012-07-16 15:34:40

+0

近正如我所知道的,你在這裏所做的任何事都不需要手勢識別器。它可以用正常的滾動視圖和普通的'UIButton'完成。 – 2012-07-16 15:37:57

回答

0

你並不需要添加UIGestureRecognizer爲一個UIButton一個簡單的TouchUpInside動作,簡單地做這樣的事情:

[button addTarget:self action:@selector(buttonSelect:) forControlEvents:UIControlEventTouchUpInside]; 

然後創建選擇:

-(IBAction)buttonSelect:(id)sender{//do stuff here} 
+0

中所述的內容。我在上面的問題中添加了上下文..我希望它能更清楚地說明一些內容 – xonegirlz 2012-07-16 15:34:59

+0

如果快速執行,它會滾動嗎? ?就像一個起源於按鈕的輕掃手勢?我認爲,如果你按住設備將不會註冊更多的觸摸,直到它處理當前的一個編輯:我用我的項目之一用編程方式在scrollView中添加按鈕進行測試,它會滾動,如果你快速,但停止如果你按住按鈕。我能想到的唯一辦法是讓按鈕不可互動,然後當觸摸結束時,抓住座標並調用選擇器,同時傳遞按鈕的標籤,您可以根據邊界在代碼中找到 – jacerate 2012-07-16 15:37:26

+0

讓我知道您是否需要一些更多的解釋或一個例子 – jacerate 2012-07-16 15:40:31

0

你可以試試使UIButton不可交互:

button.userInteractionEnabled = NO; 

然後添加一個UITapGestureRecognizer按鈕:

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(buttonPressed)]; 
[button addGestureRecognizer:recognizer]; 

這樣,按鈕只會響應觸摸事件,如果它被點擊,所有其他事件將轉到滾動視圖。

設置userInteractionEnabled = NO可能會阻止UITapGestureRecognizer啓動它的事件,在這種情況下,您可以使該按鈕成爲UIView或UIImageView。

4

老問題,但我只是有這個問題,並認爲人們會從答案中受益。如果您在UIScrollView中有UIControl,默認情況下,滾動不會取消觸摸事件。解決的辦法是繼承像這樣的UIScrollView:

@implementation PaginationScrollView {} 

- (id)init { 
    self = [super init]; 
    if (self) { 
     self.canCancelContentTouches = YES; 
    } 
    return self; 
} 

- (BOOL)touchesShouldCancelInContentView:(UIView *)view { 
    return YES; 
} 

@end 

如果視圖是一個UIControl touchesShouldCancelInContentView的默認實現返回NO。

+0

initWithFrame:是UIScrollview的指定初始化程序,所以你應該把初始化放入那個。 'init'不保證被調用。 – fishinear 2013-03-22 18:07:56

3

確保選中設置

yourScrollView.canCancelContentTouches = YES; 

仍然無法正常使用? 因爲它只能取消觸摸,而不是UIControlEvents這樣UIControlEventTouchUpInside

如何解決? 添加到您的.m文件的頂部

@implementation UIScrollView (TouchesShouldCancelInContentView) 

- (BOOL)touchesShouldCancelInContentView:(UIView *)view { 
    return YES; 
} 

@end 
+0

這被稱爲類別抨擊,並沒有被認爲是好的代碼風格。不要在類別中覆蓋方法。更好地創建一個子類。 – fabb 2015-11-26 15:41:47

+0

@fabb我不會說這不是一個好的代碼風格。這取決於開發人員的設計。例如,我需要在我的應用程序中的所有滾動視圖來取消觸摸,因此對於我而言,分類和重寫應該是一個不錯的選擇。但是,如果開發人員想要在某些滾動視圖中取消觸摸,則子類更好。感謝您指出它的壽命!好點子! – 2015-11-26 18:04:13