Mobile Safari le permite cambiar de página ingresando una especie de vista de paginación horizontal UIScrollView con un control de página en la parte inferior.
Estoy tratando de replicar este comportamiento particular en el que un UIScrollView desplazable horizontalmente muestra parte del contenido de la siguiente vista.
El ejemplo proporcionado por Apple: PageControl muestra cómo usar un UIScrollView para la paginación horizontal, pero todas las vistas ocupan todo el ancho de la pantalla.
¿Cómo obtengo un UIScrollView para mostrar algún contenido de la siguiente vista como lo hace Safari móvil?
ios
iphone
cocoa-touch
uiscrollview
primer respondedor
fuente
fuente
Respuestas:
A
UIScrollView
con la paginación habilitada se detendrá en múltiplos de su ancho (o alto) de marco. Entonces, el primer paso es averiguar qué tan amplias quieres que sean tus páginas. Que sea el ancho delUIScrollView
. Luego, establezca los tamaños de su subvista por muy grandes que necesite, y establezca sus centros en base a múltiplos de laUIScrollView
anchura.Entonces, ya que desea ver las otras páginas, por supuesto, establecidos
clipsToBounds
aNO
lo mhjoy declaró. La parte del truco ahora es hacer que se desplace cuando el usuario comience a arrastrar fuera del rango delUIScrollView
marco de. Mi solución (cuando tuve que hacer esto muy recientemente) fue la siguiente:Cree una
UIView
subclase (es decirClipView
) que contendrá lasUIScrollView
subvistas y sus. Esencialmente, debe tener el marco de lo que supondríaUIScrollView
que tendría en circunstancias normales. Coloque elUIScrollView
en el centro delClipView
. Asegúrese de que elClipView
'sclipsToBounds
esté configurado comoYES
si su ancho es menor que el de su vista principal. Además,ClipView
necesita una referencia aUIScrollView
.El último paso es anular
- (UIView *)hitTest:withEvent:
dentro delClipView
.Básicamente, esto expande el área táctil del
UIScrollView
al marco de la vista de su padre, exactamente lo que necesita.Otra opción sería crear una subclase
UIScrollView
y anular su- (BOOL)pointInside:(CGPoint) point withEvent:(UIEvent *) event
método, sin embargo, aún necesitará una vista de contenedor para hacer el recorte, y puede ser difícil determinar cuándo regresarYES
basándose solo en elUIScrollView
marco de.NOTA: También debe echar un vistazo a la modificación hitTest: withEvent: de Juri Pakaste si tiene problemas con la interacción del usuario de la subvista.
fuente
UIScrollView
subclase para la carga diferida de vistas (enlayoutSubviews
) y usé aclippingRect
para hacer laspointInside:withEvent:
pruebas. Funciona muy bien y no se requiere una vista de contenedor adicional.UIScrollView
subclase como @ohhorob pero con una vista contenedor para el recorte y el retorno[super pointInside:CGPointMake(self.contentOffset.x + self.frame.size.width/2, self.contentOffset.y + self.frame.size.height/2) withEvent:event];
depointInside:withEvent:
. Esto funciona muy bien y no hay problemas con la interacción del usuario mencionados en la respuesta de @ JuriPakaste.- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
agregado a UIScrollViewDelegate en iOS5 significa que ya no tienen que pasar por esta palabrería.La
ClipView
solución anterior funcionó para mí, pero tuve que hacer una-[UIView hitTest:withEvent:]
implementación diferente . La versión de Ed Marty no logró que la interacción del usuario funcionara con las vistas de desplazamiento verticales que tengo dentro de la horizontal.La siguiente versión funcionó para mí:
fuente
Establezca el tamaño del marco de scrollView como el tamaño de sus páginas:
Ahora puede desplazarse
self.view
y el contenido de scrollView se desplazará.También utilícelo
scrollView.clipsToBounds = NO;
para evitar recortar el contenido.fuente
Terminé usando el UIScrollView personalizado yo mismo, ya que era el método más rápido y simple que me parecía. Sin embargo, no vi ningún código exacto, así que pensé que lo compartiría. Mis necesidades eran un UIScrollView que tuviera un contenido pequeño y, por lo tanto, el UIScrollView en sí era pequeño para lograr el efecto de paginación. Como dice la publicación, no se puede deslizar. Pero ahora puedes.
Cree una clase CustomScrollView y una subclase UIScrollView. Luego, todo lo que necesita hacer es agregar esto al archivo .m:
Esto le permite desplazarse de un lado a otro (horizontal). Ajuste los límites en consecuencia para establecer su área táctil de deslizamiento / desplazamiento. ¡Disfrutar!
fuente
He realizado otra implementación que puede devolver la vista de desplazamiento automáticamente. Por lo tanto, no necesita tener un IBOutlet que limitará la reutilización en el proyecto.
fuente
Tengo otra modificación potencialmente útil para la implementación de ClipView hitTest. No me gustó tener que proporcionar una referencia UIScrollView a ClipView. Mi implementación a continuación le permite reutilizar la clase ClipView para expandir el área de prueba de impacto de cualquier cosa y no tener que proporcionarle una referencia.
fuente
Implementé la sugerencia de voto positivo anterior, pero el
UICollectionView
que estaba usando consideró que cualquier cosa fuera del marco fuera de la pantalla. Esto hizo que las celdas cercanas solo se mostraran fuera de los límites cuando el usuario se desplazaba hacia ellas, lo que no era ideal.Lo que terminé haciendo fue emular el comportamiento de una vista de desplazamiento agregando el método a continuación al delegado (o
UICollectionViewLayout
).Esto evita la delegación de la acción de deslizar por completo, lo que también fue una ventaja. El
UIScrollViewDelegate
tiene un método similar llamadoscrollViewWillEndDragging:withVelocity:targetContentOffset:
que podría ser utilizado para UITableViews de página y UIScrollViews.fuente
Habilite el disparo de eventos de toque en las vistas secundarias de la vista de desplazamiento mientras apoya la técnica de esta pregunta SO. Utiliza una referencia a la vista de desplazamiento (self.scrollView) para facilitar la lectura.
Agregue esto a la vista de su hijo para capturar el evento táctil:
(Esta es una variación de la solución de user1856273. Se limpió para facilitar la lectura e incorporó la corrección de errores de Bartserk. Pensé en editar la respuesta de user1856273, pero era un cambio demasiado grande para hacer).
fuente
mi versión Presionando el botón que se encuentra en el pergamino - trabajo =)
pero solo [[self subviews] objectAtIndex: 0] debe ser un desplazamiento
fuente
Aquí hay una respuesta rápida basada en la respuesta de Ed Marty, pero también incluye la modificación de Juri Pakaste para permitir toques de botones, etc.dentro de la vista de desplazamiento.
fuente