2012-06-30 7 views
14

Quindi in un UITableView quando ci sono sezioni la vista di sezione rimane in alto fino a quando la sezione successiva si sovrappone e poi la sostituisce in cima. Voglio avere un effetto simile, in cui fondamentalmente ho un UIView nel mio UIScrollView, che rappresenta le sezioni di UIView e quando arriva in cima .. Voglio che rimanga lì dentro e non venga portato avanti. Come faccio a fare questo? Penso che questo debba essere fatto sia in layoutSubviews che scrollViewDidScroll e fare una manipolazione su UIVIew ..rendere UIView in UIScrollView bastone in alto quando si scorre su

risposta

2

Se ricordo male, la presentazione 2010 WWDC ScrollView discute precisamente come mantenere una vista in una posizione fissa mentre altri elementi lo fanno scorrere intorno . Guarda il video e dovresti avere un approccio chiaro da implementare.

Sta essenzialmente aggiornando i frame basati sui callback scrollViewDidScroll (sebbene la memoria sia un po 'confusa sui punti più fini).

+0

hmm .. in pratica devi controllare se l'UIView sezionato è in cima e poi tenerlo lì a destra? Il mio problema è come determinare se l'Uiview sezionato è "top" – xonegirlz

+0

Per determinare quale vista è in primo piano, puoi chiedere al superview la sua matrice di subviews, ad es. NSArray * sottoview = [sottoview superview]. Quindi, chiedi al tuo array gli indici delle sottoview che desideri confrontare, ad es. NSUInteger oneIndex = [subviews indexOfObject: viewOne], twoIndex = [subviews indexOfObject: viewTwo]. Una volta che hai scelto gli indici per entrambe le sottoview, valuta semplicemente quale è maggiore per determinare quali sono l'uno sopra l'altro. – isaac

+0

quando dico in alto, non significa uno sopra l'altro .. ma voglio dire che è a contentOffSet.y – xonegirlz

19

Per creare UIView in UIScrollView attaccare alla parte superiore quando scorrere fino fare:

- (void)createHeaderView:(UIView*)headerView { 
    _headerView = [headerView retain]; 
    _headerViewInitialY = _headerView.frame.origin.y; 
    [_scrollView addSubview:_headerView]; 
    _scrollView.delegate = self; 
} 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    CGRect headerFrame = _headerView.frame; 
    headerFrame.origin.y = MAX(_headerViewInitialY, scrollView.contentOffset.y); 
    _headerView.frame = headerFrame; 
} 
+1

Davvero un bell'aspetto – svmrajesh

+2

Assicurati che la vista che intendi catturare pergamene abbia un set di delegati, e che delegato sia dove vivrà scrollViewDidScroll. Se si consente al controller di implementare il protocollo , è possibile assegnare il delegato come 'self' nel controller come [this] (http://stackoverflow.com/a/14096093) –

+0

Ho provato questo e funziona bene ma il mio punto di vista diventa traslucido e ho provato tutto ma non ci sono riuscito, quindi per favore puoi aiutarmi a capire come funziona. È solo traslucido per un po 'fino a quando non si attacca all'inizio – Soniya

9

Swift soluzione in base alla risposta del Evya:

var navigationBarOriginalOffset : CGFloat? 

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    navigationBarOriginalOffset = navigationBar.frame.origin.y 
} 

func scrollViewDidScroll(scrollView: UIScrollView) { 
    navigationBar.frame.origin.y = max(navigationBarOriginalOffset!, scrollView.contentOffset.y) 
} 
2

soluzione Evya funziona davvero bene, se si utilizza Auto Layout, dovresti fare qualcosa del genere (la sintassi Auto Layout è scritta in Masonry, ma ti viene l'idea.):

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 

    //Make the header view sticky to the top. 
    [self.headerView mas_remakeConstraints:^(MASConstraintMaker *make) { 
     make.top.equalTo(self.scrollView.mas_top).with.offset(scrollView.contentOffset.y); 
     make.left.equalTo(self.scrollView.mas_left); 
     make.right.equalTo(self.scrollView.mas_right); 

     make.height.equalTo(@(headerViewHeight)); 
    }]; 

    [self.scrollView bringSubviewToFront:self.headerView]; 
} 
+2

Sfortunatamente questo ti costringe a ricreare i vincoli del layout con ogni fotogramma di movimento di scorrimento. Invece, quello che dovresti fare è avere un contenitore contenente 'UIScrollView' e rendere la parte superiore dell'intestazione uguale alla parte superiore * del contenitore *, non l'offset del contenuto più alto della scrollview. Facendolo in questo modo ti permette di impostare i vincoli una volta. –

+0

mas_updateConstraints – Jaro

Problemi correlati