2014-04-27 2 views
5

ho un UITableview con una sottoclasse di UIVIew sulla cima di una sezione della tabella, in questo modo:UIView in cima UIScrollView, passano attraverso solo rotoli, non rubinetti

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

La vista ha la stessa superview del tableview, ma copre parzialmente il tableview. Ci sono alcuni pulsanti su UIView. Voglio che l'utente sia in grado di scorrere sulla vista e successivamente spostare la vista tabella (come se stesse scorrendo sul tavolo). Ma, se tocca un pulsante sulla vista, voglio che quel tocco si registri sulla vista, non venga inviato alla tableview. In questo momento, sto sovrascrivendo il metodo - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event della vista per restituire sempre NO, che funziona per lo scorrimento ma ha l'effetto di inviare tutti i tocchi giù al tableview, rendendo i miei pulsanti inefficaci. C'è un modo per me di trasmettere i gesti di scorrimento/panoramica alla tabella ma mantenere i gesti di tocco?

Grazie,

+0

Perché non puoi impostare quella vista come tableHeaderView? –

risposta

8

Invece di sempre tornare NO da pointInside, controllare per vedere se il punto interseca le tue subviews UIButton - e ritorno SÌ se lo fa.

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

    return NO; 
} 

EDIT: soluzione alternativa

Per il tuo commento che desideri l'utente per iniziare lo scorrimento del UITableView con un touch-down su uno dei pulsanti di visualizzazione secondaria. Per fare in modo che questo funzioni, devi rendere UIView che contenga i tuoi bottoni in una sottoview di UITableView.

Così facendo, UIView inizierà a scorrere con UITableViewCells. Per evitare ciò, è necessario regolare il fotogramma come avviene lo scorrimento, o eventualmente bloccarlo in posizione usando i vincoli.

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

Grazie Tom. Funziona abbastanza bene tranne per un problema. In una vista tabella normale con un pulsante, se si avvia il dito sul pulsante e si scorre rapidamente, l'azione del pulsante viene annullata e lo scorrimento viene registrato. Nel caso che hai menzionato sopra, se provo a fare la stessa cosa, la pergamena non viene mai registrata. C'è un modo per farlo, forse restituendo NO se la velocità dello scroll è più veloce di un certo valore? –

+0

@KyleRosenbluth - Penso di capire quello che cerchi. Ho aggiornato la soluzione per tener conto di ciò. – TomSwift

+0

Stavo per creare una risposta ma la modifica di Tom mi ha battuto su di essa. Comunque ecco un esempio che mostra che al lavoro: https://gist.github.com/mnmaraes/3dfae9ed353fe49e9d0b – Murillo