¿Cómo mantener UIView a una distancia relativa de otros después de cambiar el tamaño?

Yo tengo cinco UIView en un UIScrollView. Todos ellos con el mismo ancho. Cada vista tiene otras subvistas que cambian el tamaño de su altura de acuerdo con el contenido asignado, lo que hace que la UIView principal y la UIScrollView redimensionable también. Estoy tratando de mantener los 5 UIView separadas entre sí a cierta distancia de "relleno", incluso después de cambiar el tamaño. Lo que hago ahora es configurar la posición del origin.y y la altura de cada UIView cuando layoutSubviews se llama. ¿Hay una manera más fácil de hacer esto?
He tratado de establecer su posición en la creación como: CGRectMake(0, aboveView.frame.origin.y + aboveView.frame.size.height + Padding, width, 0) y estableciendo su autoresizingMask a UIViewAutoresizingMaskTopMargin. Esperando que cuando llame sizeToFit en lo principal UIView, Todos los UView establecerá sus posiciones en relación con la vista sobre ellos.

preguntado el 10 de marzo de 12 a las 01:03

1 Respuestas

Primordial layoutSubviews es la manera correcta de hacer esto. UIKit no tiene ninguna gestión de diseño integrada que pueda hacerlo por usted.

Sin embargo, es posible que no te des cuenta de que UIScrollView se envía a sí mismo layoutSubviews cada vez que se desplaza, en cada fotograma del desplazamiento. ¡Eso puede ser mucho más a menudo de lo que necesita! No querrás hacer mucho trabajo en un UIScrollView's layoutSubviews si puedes evitarlo.

Para evitar hacer un diseño adicional, le sugiero que configure su jerarquía de vistas de esta manera:

UIScrollView
    ContainerView with layoutSubviews method
        content view 1
        content view 2
        content view 3
        content view 4
        content view 5

Utilice un estándar UIScrollView. Dale una subvista, que es una vista personalizada. UIView subclase (lo llamé ContainerView en mi ejemplo). El ContainerView tiene sus cinco vistas de contenido como subvistas.

Cuando asigne contenido nuevo a una de sus cinco vistas de contenido, envíe sizeToFit a esa vista de contenido. Si el tamaño de la vista cambia, UIKit debería enviar automáticamente layoutSubviews a su supervisión - el ContainerView. La ContainerView's layoutSubviews El método ajusta la posición de sus subvistas para mantener el relleno entre ellas, y luego establece el contentSize de su padre - el UIScrollView.

- (void)layoutSubviews {
    CGRect myFrame = CGRectZero;
    for (UIView *subview in self.subviews) {
        CGRect frame = subview.frame;
        if (myFrame.size.height > 0) {
            frame.origin.y = myBounds.size.height + Padding;
            subview.frame = frame;
        }
        myFrame = CGRectUnion(myFrame, frame);
    }
    self.frame = myFrame;
    UIScrollView *scrollView = self.superview;
    scrollView.contentSize = myFrame.size;
}

De esta manera, no hace ningún trabajo adicional solo porque la vista de desplazamiento se desplazó. Solo diseña sus vistas de contenido cuando el contenido realmente cambia.

respondido 10 mar '12, 07:03

esta es la forma en que lo estoy haciendo. Gracias por dejarlo claro. Simplemente me parece que es mucho código adicional para algo que debería ser más fácil. - GianPac

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.