2014-04-27 10 views
5

Mam UITableview z podklasy UIVIew na szczycie sekcji tabeli, tak jak poniżej:UIView na szczycie UIScrollView, przechodzą przez zaledwie przewija, nie krany

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

Widok ma ten sam widok co widok tabeli, ale częściowo obejmuje widok tabeli. Jest kilka przycisków na UIView. Chcę, aby użytkownik mógł przewijać widok, a następnie przenosić widok tabeli (tak jakby przewijał się na stole). Ale jeśli dotknie przycisku na widoku, chcę, aby ten dotknij, aby zarejestrować się w widoku, nie zostanie wysłany do widoku stołowego. W tej chwili nadpisuję metodę widoku - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event, aby zawsze zwracać NO, która działa na przewijanie, ale ma efekt wysyłania wszystkich dotknięć w dół do widoku tabeli, co powoduje, że moje przyciski są nieskuteczne. Czy jest jakiś sposób, aby przekazać gesty przesunięcia/przesunięcia do widoku tabeli, ale zachować gesty?

Dzięki,

+0

Dlaczego nie można ustawić tego widoku jako tableHeaderView? –

Odpowiedz

8

Zamiast zawsze powrocie NO z pointInside, sprawdź, czy punkt przecięcia dowolnych subviews UIButton - i powrotu TAK jeśli to robi.

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

    return NO; 
} 

EDIT: Rozwiązanie alternatywne

Per komentarza chcesz użytkownikowi rozpocząć przewijanie UITableView z dotykowym w dół na jednym z przycisków podrzędny. Aby to zadziałało, musisz ustawić UIView, który zawiera twoje przyciski, jako podzbiór widoku UITableView.

W ten sposób UIView zacznie przewijać razem z UITableViewCells. Aby temu zapobiec, musisz dostosować ramkę tak, jak dzieje się przewijanie lub ewentualnie zablokować ją przy użyciu wiązań.

- (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

Dzięki Tom. Działa to całkiem dobrze, z wyjątkiem jednego problemu. W normalnym widoku tabelkowym za pomocą przycisku, po naciśnięciu przycisku i szybkim przewijaniu akcja przycisku jest przesuwana i rejestrowane jest przesunięcie. W przypadku, o którym wspomniałeś powyżej, jeśli spróbuję zrobić to samo, zwój nigdy nie zostanie zarejestrowany. Czy istnieje sposób, aby to zrobić, być może zwracając NO, jeśli prędkość zwoju jest większa niż pewna wartość? –

+0

@KyleRosenbluth - Myślę, że rozumiem, o co nam chodzi. Zaktualizowałem rozwiązanie, aby to uwzględnić. – TomSwift

+0

Chciałem stworzyć odpowiedź, ale edycja Toma pobiła mnie do tego. Tak czy inaczej tutaj jest istota, która pokazuje, że w pracy: https://gist.github.com/mnmaraes/3dfae9ed353fe49e9d0b – Murillo

Powiązane problemy