UIScrollView no se desplaza hasta que la orientación cambia

Tengo un UIScrollView añadido dinámicamente a la vista principal, y lo estoy llenando con pequeños objects UIView. Estoy configurando su contenido en algo más grande que la resolución del dispositivo pero no puedo desplazarlo hasta que cambie la orientación del dispositivo.

¿Cómo puedo hacer que se desplace antes del cambio de orientación?

POSTERIOR EDICION:

Me di count de que el problema proviene de ciertas subvenciones que estoy agregando, más específicamente de agregar algunas restricciones para esas subvenciones:

Aquí está el código donde estoy agregando las subvistas (el método se llama de 10 a 20 veces):

-(void) addShelve:(NSInteger) index { FSShelf *shelf = [[FSShelf alloc] initWithFrame:CGRectMake(0, index * [FSConstants getShelfVerticalDistance], 0, 0)]; [shelves addObject:shelf]; [shelfView addSubview:shelf]; [shelf addShelfConstraints]; } 

FSShelf es una subclass de UIView y shelfView es mi subclass de UIScrollView.

Y aquí están las restricciones agregadas en addShelfContraints :

  [self.superview addConstraint:[FSUtils getWidthConstraintFor:self.superview with:self constant: -2 * ([FSConstants getShelveMargin])]]; [self addConstraint:[FSUtils getSelfHeightConstraintFor:self constant:30]]; [self.superview addConstraint:[FSUtils getCenterXConstraintFor:self.superview with:self constant:0]]; 

Los methods de la class FSUtils para agregar restricciones:

 + (NSLayoutConstraint *)getSelfHeightConstraintFor:(UIView *)view constant:(CGFloat)constant { NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:constant]; return constraint; } + (NSLayoutConstraint *)getCenterXConstraintFor:(UIView *)superView with:(UIView *)subView constant:(CGFloat)constant { NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:constant]; return constraint; } + (NSLayoutConstraint *)getWidthConstraintFor:(UIView *)superView with:(UIView *)subView constant:(CGFloat)constant { NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeWidth multiplier:1.0 constant:constant]; return constraint; } 

¿Se da count de algo malo con esas restricciones?

En tu sola Toque, intenta crear así

 UIScrollView * scrollview = [[UIScrollView alloc]init]; CGRect viewFrame = self.view.frame; [scrollview setFrame:viewFrame]; [scrollview setShowsHorizontalScrollIndicator:YES]; [scrollview setShowsVerticalScrollIndicator:YES]; UIView * view = [[UIView alloc]init]; CGRect viewDoubleFrame = CGRectMake(viewFrame.origin.x,viewFrame.origin.y,viewFrame.size.width * 2,viewFrame.size.height *2); [view setFrame:viewDoubleFrame]; [view setBackgroundColor:[UIColor darkGrayColor]]; // add your additional components here [scrollview setContentSize:CGSizeMake(view.frame.size.width,view.frame.size.height)]; [scrollview addSubview:view]; [self.view addSubview:scrollview]; 

El desplazamiento no tiene ninguna relación con la resolución del dispositivo. El desplazamiento se produce cuando el tamaño de su contenido es mayor que el tamaño de su marco scrollView.

En general, para hacer que el desplazamiento sea posible para el contenido con un tamaño de 100 * 100, debe tener una vista de desplazamiento que tenga un tamaño de marco inferior a 100 * 100. Si frame.width <contentsize.width, permitirá el desplazamiento horizontal. De la misma manera, si frame.height <contentsize.height, permitirá el desplazamiento vertical.

Es posible que haya seleccionado el layout automático o que haya utilizado banderas de cambio de tamaño automático sin cuidado, lo que puede hacer que el tamaño de su scrollview.fr sea mayor que el contenido. Cuando proporciona orientación, el marco se puede acomodar perfectamente y puede desplazarse.

Publique el código si desea detectar el problema exacto.

Las restricciones que está intentando colocar en shelfView (que supongo que es su UIScrollView) no son sensatas. Está creando subvistas de plataforma con ancho cero y origen cero FSShelf *shelf = [[FSShelf alloc] initWithFrame:CGRectMake(0, index * [FSConstants getShelfVerticalDistance], 0, 0)]; e inmediatamente intentando restringir el shelfView para que tenga el mismo ancho cero less alguna constante (por lo que shelfView necesitaría ancho negativo) y luego el mismo centro x que la subvista, ¡pero la vista de estantería sigue siendo ancho cero y tiene origen cero! La única restricción que está asignando a las subvistas de la estantería está en su altura. De hecho, creo que falta algo aquí. Con el código que ha publicado, las subvisualizaciones de su estantería siempre tienen un ancho cero. ¿Realmente ves alguna de las subvistas de la plataforma en la pantalla?

De todos modos, aquí está mi consejo: tratar de agregar restricciones a shelfView basado en cada una de sus subvenciones de plataforma es una propuesta perdedora. En este caso, las restricciones parecen ser insatisfactorias y, en general, encontrará que varias restricciones se vuelven insatisfactorias, a less que tenga mucho cuidado para asegurarse de que todas las subvistas siempre estén de acuerdo con la forma exacta en que se debe diseñar su supervisión.

En lugar de todo esto, simplemente olvide el código de restricciones. Lo que intentas hacer es muy simple. Se supone que shelfView debe tener un marco igual al tamaño de la pantalla (o el marco de la aplicación, de todos modos probablemente los límites de su supervisión) y las vistas de estantería se deben colocar verticalmente con algunos márgenes verticales entre ellos y algunos márgenes horizontales que se separan ellos desde el borde de la pantalla. Agregue las vistas como ahora, pero en lugar de agregar cualquier restricción llame [self.view setNeedsLayout]; y luego implementa el método viewDidLayoutSubviews en tu controller de vista. Querrás algo como esto:

 - (void)viewDidLayoutSubviews { const CGRect rootViewBounds = self.view.bounds; shelfView.frame = rootViewBounds; const CGFloat kHorizontalMargin = [FSConstants getShelveMargin]; const CGFloat kVerticalDistancePerShelf = [FSConstants getShelfVerticalDistance]; const CGFloat kShelfHeight = 30.0; const NSUInteger shelvesCount = [shelves count]; for (NSUInteger j = 0; j < shelvesCount; j++) { UIView *shelf = [shelves objectAtIndex:j]; shelf.frame = CGRectMake(kHorizontalMargin, j * kVerticalDistancePerShelf, CGRectGetWidth(rootViewBounds) - 2.0 * kHorizontalMargin, kShelfHeight); } shelfView.contentSize = CGSizeMake(CGRectGetWidth(rootViewBounds), (shelvesCount - 1) * kVerticalDistancePerShelf + kShelfHeight); } 

Preste atención a que si está utilizando el layout automático, simplemente cambiar el tamaño de contenido no es suficiente. La vista de desplazamiento se distribuye de una manera diferente. He encontrado muy útil esta pregunta en la stack aquí . Por lo tanto, verifique si está utilizando el layout automático y adáptelo o desactívelo.
Espero que esto ayude, Andrea

[EDITAR]
Si segmenta dispositivos> = iOS6, ¿por qué no utiliza vistas de colección? Son cosas geniales, con algunas funciones de layout y gracias a Peter tienes un reemploop en iOS> = 4.3. Por lo que entendí, podrían adaptarse a sus necesidades. github