¿Cómo puedo hacer un UIScrollView
desplazamiento hacia abajo en mi código? ¿O de una manera más genérica, a cualquier punto de una subvista?
298
¿Cómo puedo hacer un UIScrollView
desplazamiento hacia abajo en mi código? ¿O de una manera más genérica, a cualquier punto de una subvista?
Puede usar la setContentOffset:animated:
función UIScrollView para desplazarse a cualquier parte de la vista de contenido. Aquí hay un código que se desplazaría hacia abajo, suponiendo que su scrollView sea self.scrollView
:
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];
¡Espero que ayude!
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
contentSize
es inferior abounds
. Entonces debería ser así:scrollView.setContentOffset(CGPointMake(0, max(scrollView.contentSize.height - scrollView.bounds.size.height, 0) ), animated: true)
let bottomOffsetY = max(collectionView.contentSize.height - collectionView.bounds.height + collectionView.contentInset.bottom, 0)
Versión rápida de la respuesta aceptada para copiar y pegar fácilmente:
fuente
La solución más simple:
fuente
Solo una mejora a la respuesta existente.
También se encarga del recuadro inferior (en caso de que lo esté usando para ajustar su vista de desplazamiento cuando el teclado está visible)
fuente
Una implementación rápida:
úsalo:
fuente
Establecer el desplazamiento del contenido a la altura del tamaño del contenido es incorrecto: desplaza la parte inferior del contenido a la parte superior de la vista de desplazamiento y, por lo tanto, no se ve.
La solución correcta es desplazar la parte inferior del contenido hacia la parte inferior de la vista de desplazamiento, de esta manera (
sv
es el UIScrollView):fuente
if (sv.contentOffset.y + csz.height > bsz.height) {
?setContentOffset:
comando lo que importa.Una solución Swift 2.2, teniendo
contentInset
en cuentaEsto debería estar en una extensión
Tenga en cuenta que es posible que desee comprobar si
bottomOffset.y > 0
antes de desplazarsefuente
¿Qué pasa si
contentSize
es menor quebounds
?Para Swift es:
fuente
Vuelve al comienzo
Desplazarse hacia abajo
fuente
También encontré otra forma útil de hacerlo en el caso de que esté utilizando una UITableview (que es una subclase de UIScrollView):
fuente
Usando la
setContentOffset:animated:
función UIScrollView para desplazarse hacia abajo en Swift.fuente
Parece que todas las respuestas aquí no tomaron en cuenta el área segura. Desde iOS 11, iPhone X introdujo un área segura. Esto puede afectar los scrollView's
contentInset
.Para iOS 11 y superior, para desplazarse correctamente hasta la parte inferior con el contenido incluido. Deberías usar en
adjustedContentInset
lugar decontentInset
. Comprueba este código:contentOffset.x
):Referencias
fuente
Con un (opcional)
footerView
ycontentInset
, la solución es:fuente
Rápido:
Podrías usar una extensión como esta:
Utilizar:
fuente
valdyr, espero que esto te ayude:
fuente
Categoría al rescate!
Agregue esto a un encabezado de utilidad compartida en alguna parte:
Y luego a esa implementación de utilidad:
Luego impleméntelo donde quiera, por ejemplo:
fuente
Para vista de desplazamiento horizontal
Si me gusta tiene una vista de desplazamiento horizontal y desea desplazarse hasta el final (en mi caso, a la derecha), debe cambiar algunas partes de la respuesta aceptada:
C objetivo
Rápido
fuente
Si de alguna forma cambiar ScrollView contentSize (ej. Añadir algo a stackView que está dentro ScrollView) debe llamar
scrollView.layoutIfNeeded()
antes de desplazarse, de lo contrario, no hace nada.Ejemplo:
fuente
Una buena manera de asegurarse de que la parte inferior de su contenido sea visible es usar la fórmula:
Esto garantiza que el borde inferior de su contenido esté siempre en o por encima del borde inferior de la vista. Se
MIN(0, ...)
requiere porqueUITableView
(y probablementeUIScrollView
) aseguracontentOffsetY >= 0
cuando el usuario intenta desplazarse haciendo un snap visiblecontentOffsetY = 0
. Esto parece bastante extraño para el usuario.El código para implementar esto es:
fuente
Si no necesita animación, esto funciona:
fuente
Si bien la
Matt
solución me parece correcta, debe tener en cuenta también la inserción de la vista de recopilación si hay una que se ha configurado.El código adaptado será:
fuente
En rápido:
fuente
Solución para desplazarse al último elemento de una vista de tabla:
Swift 3:
fuente
No funcionó para mí, cuando traté de usarlo en
UITableViewController
elself.tableView
(iOS 4.1)
, después de añadirfooterView
. Se desplaza fuera de los bordes, mostrando la pantalla en negro.Solución alternativa:
fuente
fuente
Descubrí que en
contentSize
realidad no refleja el tamaño real del texto, por lo que cuando intente desplazarse hacia la parte inferior, estará un poco apagado. La mejor manera de determinar el tamaño real del contenido es usar el método deNSLayoutManager
susedRectForTextContainer:
:Para determinar cuánto texto se muestra realmente en el
UITextView
, puede calcularlo restando las inserciones del contenedor de texto de la altura del marco.Entonces se vuelve fácil desplazarse:
Algunos números de referencia sobre lo que representan los diferentes tamaños para un vacío
UITextView
.fuente
Extienda UIScrollView para agregar un método scrollToBottom:
fuente
Xamarin.iOS versión de respuesta aceptada
fuente
Versión Xamarin.iOS
UICollectionView
de la respuesta aceptada para facilitar la copia y el pegadofuente