2010-11-25 9 views
16

En IB tengo mi UIView. Luego tengo una sub-UIView con UIScrollView como una sub-vista. Entonces UIScrollView tiene un sub-UIImageView. UIScrollView y UIImageView son del mismo tamaño. Son mucho más grandes que la UIView de la que son subvistas. Supuse que esto haría que el desplazamiento funcionara. No es así ¿Se necesita algún tipo de código para que funcionen las vistas de desplazamiento?¡UIScrollView no se desplazará!

Respuesta

29

Debe establecer UIScrollView.contentSize para que coincida con el tamaño total de desplazamiento, que es el tamaño de su marco de subvista en este caso.

+0

¿Entonces eso tiene que hacerse con el código que no está en IB? – Marty

+1

Supongo que sí. Nunca vi eso en IB. – tia

+0

Sí, tenía que hacerse con setContentSize: – Marty

6

Para desplazarse, debe hacer que el marco de la vista de desplazamiento sea más pequeño que su contenido, la imagen o vista que lo contiene.

+0

hizo eso sin suerte. la subvista de scrollview (uiimageview) es más grande que la vista de desplazamiento. – Marty

+0

¿Ha configurado el tamaño del contenido para que coincida con el tamaño de la imagen? Si no, solo estás recortando la imagen ... no queda nada para desplazarte. – hotpaw2

+0

Configuré el tamaño del marco en IB, ¿es eso lo que quieres decir? Aunque no hice nada con el código. – Marty

3

Puse todo el contenido de mi scrollview en IB. (botones, etiquetas, campos de texto, etc.). El tamaño completo es 500 alto. Luego cambié el tamaño a 436 alto en IB.

Luego en el código, pongo esto es viewDidLoad:

optionsScrollView.contentSize = CGSizeMake(320,500); 

Así que deja 64 píxeles que puede desplazarse. Funciona perfectamente

También coloqué "UIScrollViewDelegate" en el <> llaves de @interface para mi archivo .h y até la salida de delegado de la vista de desplazamiento al propietario de File en IB.

1

más, ¿habilitó el desplazamiento? vistazo a la propiedad

@property(nonatomic, getter=isScrollEnabled) BOOL scrollEnabled 
1

vista de desplazamiento funciona con esto:
marco
continuación
contentSize
vistas u objetos etc ...

Si el cuadro está ajustada al tamaño de su contenido, entonces no se desplazará. Configure su marco (en el panel derecho de IB -> segunda última pestaña 'Inspector de tamaño') a la longitud de su aplicación (en mi caso es 367 ya que tengo una barra de navegación y una barra de pestañas) y establezca programáticamente el tamaño de contenido en - yup has adivinado ... más de su marco para que pueda desplazarse.

Los días felices !!

4

Esto podría ser obvio para la mayoría, pero me pasé siglos preguntándose por qué mi UIScrollView no sería desplazarse por lo que' m publicar lo que me estaba deteniendo en caso de que ayude a alguien más:

UIScrollView debe tener las dimensiones del área visible en la que desea que se presente y no el tamaño de su contenido.

Ridículo en mi nombre, lo sé, pero por si acaso eso ayuda a alguien.

+0

sólo para aclarar esto un poco: el 'UIScrollView' debe ser el tamaño de lo que desea que se muestren en la pantalla, y' propiedad contentSize' de que ScrollView se debe establecer en el tamaño del área que se desplaza (el contenido). La vista de desplazamiento no se desplazará si contentSize es menor o igual que su tamaño de marco. – Olie

13

Como se menciona en la respuesta aceptada, debe establecer la propiedad UIScrollViewcontentSize.

Esto puede hacerse en Interface Builder.

  1. seleccionar la vista de desplazamiento
  2. Seleccione la 'identidad inspeccionar' en el panel de Utilidades a la derecha
  3. En 'Tiempo de ejecución definido por el usuario Atributos' haga clic en el botón '+'
  4. Establecer la 'Ruta de la clave' valor a 'contentSize'
  5. establecer el valor 'Type' a 'Tamaño'
  6. Establecer el valor de 'valor' a '{anchura, altura}' (por ejemplo: '{320, 600}')

Compila y ejecuta y tu vista de desplazamiento se desplazará.

El contenido del recuadro no afecta al desplazamiento. Ver What's the UIScrollView contentInset property for?

+1

Esto funcionó perfectamente y es una excelente explicación de cómo implementar la respuesta inicial de tia! – Ryan

+0

¡Qué gran respuesta! – HalR

+0

¿Cómo funciona esto si quiero que mi código para trabajar a través de los tipos de dispositivos, obviamente, el iPad sería mucho más amplio que este – Guy

0

Me gustaría agregar la razón por la cual mi scrollview no se desplazaba hoy. Agregué todas mis subvistas correctamente en el código. Configuro el contentSize correctamente. La interacción del usuario fue habilitada.

Mi problema estaba en el Creador de interfaces. Había colocado un UIButton como una subvista de mi UIScrollView. Ese botón causaba que la vista de desplazamiento no se desplazara. Una vez que eliminé el botón de Interface Builder y lo manejé en el código, mi scrollview comenzó a desplazarse.

Así que listo. Hay otra cosa que ver cuando intentamos descubrir por qué no está desplazándose. Compruebe Interface Builder para obtener subvistas.

1

La otra cosa importante que no veo mencionada aquí es que UIScrollView no funciona bien con AutoLayout. Si parece que has hecho todo correctamente, comprueba si tu ViewController tiene activada la función de configuración automática y, en caso afirmativo, apágalo.

(Cada vez que se desplaza, las vistas son re-diseñados, Gak.!)

Así:

  • Asegúrese ScrollView de contentSize es más grande que su frame.size
  • Asegúrese AutoLayout de ViewController está desactivado.
Cuestiones relacionadas