2012-06-30 12 views
14

Entonces en un UITableView cuando tiene secciones, la vista de sección se pega a la parte superior hasta que la siguiente sección se superpone y luego la reemplaza. Quiero tener un efecto similar, donde básicamente tengo una UIView en mi UIScrollView, que representa las secciones de UIView y cuando llega a la cima ... Quiero que permanezca allí y no se cargue. ¿Cómo hago esto? Creo que esto debe hacerse en layoutSubviews o scrollViewDidScroll y hacer una manipulación en el UIVIew ..haga que UIView en UIScrollView se adhiera a la parte superior cuando se desplazó hacia arriba

Respuesta

2

Si no recuerdo mal, la presentación 2010 WWDC ScrollView analiza con precisión cómo mantener una vista en una posición fija mientras que otros elementos se desplazan a su alrededor . Mire el video y debe tener un enfoque claro para implementar.

Básicamente está actualizando marcos basados ​​en callbacks scrollViewDidScroll (aunque la memoria es un poco confusa en los puntos más finos).

+0

hmm .. básicamente tienes que comprobar si esa UIView seccionada está en la parte superior y luego mantenerla allí ¿verdad? Mi problema es cómo determinar si ese UIView seccionado está en la "parte superior" – xonegirlz

+0

Para determinar qué vista se encuentra en la parte superior, puede solicitar a la supervista su variedad de subvistas, p. Subvistas de NSArray * = [subvistas de superview]. Luego, solicite a su matriz los índices de las subvistas que desea comparar, por ejemplo, NSUInteger oneIndex = [subviews indexOfObject: viewOne], twoIndex = [subviews indexOfObject: viewTwo]. Una vez que haya obtenido los índices de ambas subvistas, simplemente evalúe cuál es mayor para determinar cuál está sobre la otra. – isaac

+0

cuando digo arriba, sin querer decir uno encima del otro ... pero quiero decir que está en contentOffSet.y – xonegirlz

19

Para crear UIView en UIScrollView se adhieren a la parte superior cuando desplazado hasta hacer:

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

Realmente se ve bien – svmrajesh

+2

Asegúrese de que la vista que desea capturar tiene un conjunto de delegados, y ese delegado es donde se moverá scrollViewDidScroll. Si permite que su controlador implemente el protocolo , puede asignar el delegado como 'self' en el controlador como [this] (http://stackoverflow.com/a/14096093) –

+0

Intenté esto y funciona bien, pero mi vista se volvió translúcida e intenté todo, pero no lo logré, así que por favor, ¿pueden ayudarme en el camino o razonar por qué está sucediendo? Solo se vuelve translúcido por un tiempo hasta que se pega a la parte superior – Soniya

9

Swift Solución según la respuesta 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

solución de Evya funciona muy bien, sin embargo, si utiliza Auto Diseño, debe hacer algo como esto (la sintaxis de diseño automático está escrita en Masonry, pero se entiende la 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

Desafortunadamente esto te obliga a recrear las restricciones de diseño con cada fotograma del movimiento de desplazamiento. En cambio, lo que debe hacer es tener un contenedor que contenga el 'UIScrollView' y hacer que la parte superior del encabezado sea igual a la * cima del * contenedor, no la parte superior del desplazamiento más el desplazamiento del contenido. Hacerlo de esta manera le permite configurar las restricciones una vez. –

+0

mas_updateConstraints – Jaro

Cuestiones relacionadas