2014-04-27 52 views
5

我有一個UITableviewUIVIew子類放在桌子上的一個部分的頂,像這樣:的UIView上的UIScrollView的頂部,只穿過卷軸,不抽頭

-uitable-- |--uiview-| || || || || |---------| | | | | -----------

視圖具有與tableview相同的超級視圖,但部分覆蓋tableview。 UIView上有幾個按鈕。我希望用戶能夠在視圖上滾動並隨後移動tableview(就像他在桌面上滾動一樣)。但是,如果他點擊視圖上的按鈕,我希望該點擊在視圖上註冊,而不是發送到桌面視圖。現在,我重寫視圖的- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event方法,總是返回NO,它可用於滾動,但會將所有觸摸向下發送到tableview,導致我的按鈕無效。有什麼辦法讓我將輕掃/平移手勢傳遞給tableview,但保持水龍頭手勢?

感謝,

+0

爲什麼不能將該視圖設置爲tableHeaderView? –

回答

8

而不是總是從pointInside不會回來,請檢查點相交的任何您的UIButton子視圖 - 如果它確實返回YES。

- (BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    for (UIView* sv in self.subviews) 
    { 
     if (CGRectContainsPoint(sv.frame, point)) 
      return YES; 
    } 

    return NO; 
} 

編輯:另一種解決方案

每您的評論你想用戶開始與子視圖按鈕中的一個向下觸摸滾動的UITableView。爲了使這個工作,你需要使包含你的按鈕的UIView成爲UITableView的子視圖。

通過這樣做UIView將開始與UITableViewCells一起滾動。爲防止出現這種情況,您需要在發生滾動時調整框架,或者使用約束將其鎖定到位。

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 

    // instantiate your subview containing buttons. mine is coming from a nib. 
    UINib* n = [UINib nibWithNibName: @"TSView" bundle: nil]; 
    NSArray* objs = [n instantiateWithOwner: nil options: nil]; 
    _tsv = objs.firstObject; 

    // add it to the tableview: 
    [self.tableView addSubview: _tsv]; 
} 

// this is a UIScrollView delegate method - but UITableView IS a UIScrollView... 
- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    [scrollView bringSubviewToFront:_tsv]; 
    CGRect fixedFrame = _tsv.frame; 
    fixedFrame.origin.y = 100 + scrollView.contentOffset.y; 
    _tsv.frame = fixedFrame; 
} 
+0

謝謝湯姆。除了一個問題之外,這很有效。在具有按鈕的正常桌面視圖中,如果您在按鈕上開始手指並快速滾動,則按鈕操作將被覆蓋並且刷卡被註冊。在你上面提到的情況下,如果我嘗試做同樣的事情,那麼滾動永遠不會被註冊。有沒有辦法做到這一點,也許通過返回NO,如果滾動的速度快於某個值? –

+0

@KyleRosenbluth - 我想我明白你在做什麼。爲了解決這個問題,我更新瞭解決方案。 – TomSwift

+0

我打算創建一個答案,但湯姆的編輯打敗了我。無論如何,這裏的一個要點顯示,在工作:https://gist.github.com/mnmaraes/3dfae9ed353fe49e9d0b – Murillo