iOS
UIScrollView con niño StackView
Buscar..
Un ejemplo de StackView complejo dentro de Scrollview
A continuación, se muestra un ejemplo de lo que se puede hacer con las StackViews anidadas, dando al usuario la impresión de una experiencia de desplazamiento continuo utilizando elementos de alineación o elementos complejos de la interfaz de usuario.
Prevenir el diseño ambiguo.
Una pregunta frecuente sobre StackViews dentro de Scrollviews proviene de las alertas ambiguas con / heigh en el constructor de interfaces. Como se explica en esta respuesta , es necesario:
- Agregue en el UIScrollView una UIView (el contentScrollView);
- En este contentScrollView, establezca los márgenes superior, inferior, izquierdo y derecho en 0
- El conjunto también alinea el centro horizontalmente y verticalmente;
Desplazarse hasta el contenido dentro de StackViews anidados
El gran problema del desplazamiento es determinar el desplazamiento necesario para presentar (por ejemplo) un campo de texto dentro de un StackView dentro de ScrollView .
Si intentas obtener la posición de Textfield.frame.minY
puede ser 0 , porque el marco minY solo está considerando la distancia entre el elemento y la parte superior de StackView. Así que tienes que considerar todas las demás vistas / vistas de pila.
Una buena solución para esto es:
1 - Implementar la extensión ScrollView
extension UIScrollView {
func scrollToShowView(view: UIView){
var offset = view.frame.minY
var superview = view.superview
while((superview != nil)){
offset += (superview?.frame.minY)!
superview = superview?.superview
}
offset -= 100 //optional margin added on offset
self.contentOffset = CGPoint.init(x: 0, y: offset)
}
}
Esto considerará todas las vistas principales y sumará el desplazamiento necesario para que la vista de desplazamiento presente la vista necesaria en la pantalla (por ejemplo, un campo de texto que no pueda quedar detrás del teclado del usuario)
Ejemplo de uso:
func textViewDidBeginEditing(_ textView: UITextView) {
self.contentScrollView.scrollToShowView(view: textView)
}