2012-09-27 19 views
20

Estoy tratando de hacer un elemento muy simple con el nuevo iOS 6 SDK con diseño automático. Tengo un ImageView e Incrustarlo en ScrollView. (todo se compila con Interface Builder). El archivo .png está configurado y el modo imageView está configurado como "Arriba a la izquierda".Insertar ImageView en ScrollView con diseño automático en iOS 6

Implementación:

#import "ImaginariumViewController.h" 

@interface ImaginariumViewController() 
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView; 
@property (weak, nonatomic) IBOutlet UIImageView *imageView; 
@end 

@implementation ImaginariumViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.scrollView.contentSize = self.imageView.image.size; 
    self.imageView.frame = 
    CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height); 
} 

@end 

Cuando ejecuto la aplicación, la imagen no se desplaza. Al hacer lo mismo con el diseño automático desactivado (con puntales y muelles), tengo trabajo de desplazamiento. Supongo que el problema es con restricciones. ¿Podría alguien ayudarme por favor?

Respuesta

52

Acabo de encontrar el mismo problema en un tutorial que estaba actualizando. Intenté borrar programáticamente las restricciones, maldecir y golpear mi cabeza contra la pared, sin suerte.

Hace aproximadamente 5 minutos, sin embargo, probé algo que había solucionado otro problema que encontré, y, ta da! UIScrollView está trabajando de nuevo! La solución fue trasladar el antiguo código que establece la propiedad UIScrollView contentSize en una implementación de viewDidAppear, en lugar de viewDidLoad:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    self.theScroller.contentSize=CGSizeMake(200.0,2000.0); 
} 

espero que esto ayude a alguien más encontrarse con algunos de los dolores de cabeza que han aparecido con Auto Layout.

+0

Esto funciona, ¡gracias! Apple realmente extraño no ha puesto información sobre esto en iOS 6 documentos. Probablemente el problema se deba a que las restricciones se establecen más tarde de lo que se llama aviewDidLoad (aunque como viene del guión gráfico, debe estar configurado en awakeFeomNib, antes de que se llame a viewDidLoad, tan pronto como sé). – Vitaly

+2

Aunque hay otro problema con el acercamiento del imageView dentro del scrollView. – Vitaly

+0

MI DIOS que era tan molesto. ¡Tanto tiempo perdido! Tan pronto como se movió a viewDidAppear desde viewDidLoad funcionó bien. Gracias John! – Andy

27

El autodesplazamiento puede ser muy confuso al principio. En realidad, no desea establecer el tamaño del contenido de la vista de desplazamiento en ningún lugar. Con un enfoque de autolayout puro, la vista de desplazamiento establece su propio tamaño de contenido. Vea la sección sobre el diseño automático y UIScrollView en el iOS 6 release notes:

Las restricciones sobre los subvistas de la vista de desplazamiento deben dar lugar a un tamaño para llenar, lo que se interpreta entonces como el tamaño del contenido de la vista de desplazamiento. (Esto no se debe confundir con el método intrinsicContentSize utilizado para Diseño automático.)

Tenga en cuenta que esto significa que las restricciones sobre los subvistas del ScrollView deben establecer anchos explícitas y alturas y no utilizar anchos que varían según aspectos de la vista de desplazamiento

El segundo error aquí es que establece el marco de UIImageView en el tamaño de la imagen. Con el autolayout, esto también es innecesario. El UIImageView en realidad tiene un intrinsicContentSize que es del tamaño de la imagen subyacente. (Para cambiar esto, debe configurar las restricciones de anchura y altura con una alta prioridad) Eso significa que con diseño automático para colocar una imagen en un ScrollView y tienen que desplazarse por el código correcto debe ser el siguiente:

** nothing at all!!! ** 

Pero Hay todavía algo que tienes que estar atento a que ello podría causar que usted tenga una imagen que aparece no para desplazarse y la pista está en las notas de la versión aforelinked:

tenga en cuenta que se puede hacer una vista secundaria de la opinión de desplazamiento aparecen para flotar (no desplazarse) sobre el otro contenido desplazable creando restricciones entre la vista y una vista fuera del subárbol de la vista de desplazamiento, como la supervista de la vista de desplazamiento.

i.e.si establece restricciones en el constructor de interfaz y restringe la vista de imagen a una vista sobre la vista de desplazamiento en la jerarquía, afectará la forma en que aparece la vista para desplazarse. ¡Enojado!

Happy Coding ...

+0

Gracias. Sus notas sobre cómo configurar la vista de la imagen para que tenga un alto/ancho de alta prioridad me ayudaron – bean

+0

Hey @jackslash se preguntaba si sabe cómo crear una restricción entre la vista y la supervista de la vista de desplazamiento (como un ejemplo). Lo he intentado por un tiempo y no puedo ver cómo hacerlo. – Ants

+0

@Ants ¡Eso me parece una pregunta completamente nueva! Si haces un enlace aquí, lo veo. – jackslash

Cuestiones relacionadas