iOS: Pure AutoLayout y UIScrollView sin desplazamiento

Esta es la primera vez que uso UIScrollViews con un enfoque de Autolayout puro. Esto es lo que parece ser la jerarquía de vista.

view -scrollview --view1 --view2 --view3 

scrollview debe contener view1 | view2 | view3 en ese order.

Puse las vistas de desplazamiento ancho, alto, centrox y espacio inferior a supervise. La vista1, la vista2 y la vista3 que se crean todos tienen sus configuraciones de ancho y altura en su método updateConstraints. Además, se proporcionan algunas restricciones en el código. ¿Cuál es la razón por la que este scrollview no se desplaza de izquierda a derecha? He leído literalmente todas las guías que puedo encontrar en línea sobre la creación y adición de subvenciones a un UIScrollView mediante progtwigción con layout automático. Encontré alguna mención sobre tener que proporcionar cuatro restricciones diferentes, encabezado, final, superior e inferior para cada vista agregada como una subvista al scrollview. ¿Son estos los únicos NSLayoutAttributes que uno puede especificar? ¿Cómo se relacionan attributes como NSLayoutAttribueLeft o NSLayoutAttribueRight? También he leído la documentation en el website de Apple, específicamente https://developer.apple.com/library/ios/technotes/tn2154/_index.html . Adjunto la configuration que tengo actualmente. Todo se hace a través del código.

 - (void)viewDidLoad { [super viewDidLoad]; self.dataSource = @[ [[PCCGenericRating alloc] initWithTitle:@"Easiness" andMessage:@"WHAT A JOKERRRR" andVariatons:@[ @"very easy", @"easy", @"moderate", @"hard", @"very hard"]], [[PCCGenericRating alloc] initWithTitle:@"Joker" andMessage:@"WHAT A JOKERRRR" andVariatons:@[ @"very easy", @"easy", @"moderate", @"hard", @"very hard"]], [[PCCGenericRating alloc] initWithTitle:@"Difficulty" andMessage:@"YOu are not difficult at all" andVariatons:@[ @"very easy", @"easy", @"moderate", @"hard", @"very hard"]] ]; [self initView]; } - (void)initView { CGFloat navigationBarHeight = self.navigationController.navigationBar.frame.size.height; CGFloat statusBarHeight = [[UIApplication shanetworkingApplication] statusBarFrame].size.height; CGFloat heightDifference = navigationBarHeight + statusBarHeight; self.scrollView = [[UIScrollView alloc] init]; self.scrollView.delegate = self; [self.scrollView setTranslatesAutoresizingMaskIntoConstraints:NO]; self.scrollView.backgroundColor = [UIColor greenColor]; [self.view addSubview:self.scrollView]; //setup constraints [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:1.0f constant:0.0f]]; [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeHeight multiplier:1.0f constant:-heightDifference]]; [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f]]; [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0f constant:0.0]]; [self.dataSource enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { PCCGenericRating *rating = (PCCGenericRating *)obj; PCCGenericRatingView *ratingView = [self createViewWithRating:rating]; [self.scrollView addSubview:ratingView]; int multiplier = (idx == 0) ? 1 : (int) (idx + 1) ; [self.scrollView addConstraint:[NSLayoutConstraint constraintWithItem:ratingView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeCenterX multiplier:multiplier constant:0.0f]]; [self.scrollView addConstraint:[NSLayoutConstraint constraintWithItem:ratingView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:0.0f]]; }]; } - (PCCGenericRatingView *)createViewWithRating:(PCCGenericRating *)rating { PCCGenericRatingView *view = [PCCGenericRatingView genericRatingViewWithTitle:rating.title andMessage:rating.message]; return view; } 

Al imprimir las restricciones de scrollview, me parecen bien:

 po self.scrollView.constraints <__NSArrayM 0x115b051f0>( <NSLayoutConstraint:0x1145d9290 PCCGenericRatingView:0x114579880.centerX == UIScrollView:0x11458d4b0.centerX>, <NSLayoutConstraint:0x1145d9410 PCCGenericRatingView:0x114579880.centerY == UIScrollView:0x11458d4b0.centerY>, <NSLayoutConstraint:0x1145d9dd0 PCCGenericRatingView:0x1145d9560.centerX == 2*UIScrollView:0x11458d4b0.centerX>, <NSLayoutConstraint:0x1145d9e40 PCCGenericRatingView:0x1145d9560.centerY == UIScrollView:0x11458d4b0.centerY>, <NSLayoutConstraint:0x1145da6b0 PCCGenericRatingView:0x1145d9e90.centerX == 3*UIScrollView:0x11458d4b0.centerX>, <NSLayoutConstraint:0x1145da730 PCCGenericRatingView:0x1145d9e90.centerY == UIScrollView:0x11458d4b0.centerY> ) 

Aquí hay una captura de pantalla de cómo se ve: simulador

Me parece extraño que el último elemento en el origen de datos sea el primer controller de vista que aparezca en la vista de desplazamiento, cuando debería ser la última vista. Tampoco se desplaza de izquierda a derecha como debería.

Asegúrese de que su top_constraint para view1 y bottom_constraint para view3 sea ​​según sus restricciones de scrollView . De lo contrario, scrollview's contentSize contentSize: {0, 0} .

Dondequiera que esté imprimiendo sus restricciones, intente imprimir scrollview.contentSize, es probable que sea 0,0 y ahí es donde está su problema. Por lo que sé, y como mencionaste en tu publicación, debes establecer explícitamente las subvistas de una vista de desplazamiento a las restricciones de la parte superior izquierda y derecha de las vistas de desplazamiento. Al configurarlos, se establece automáticamente el contenido Tamaño de la vista de desplazamiento que le permitirá desplazarse. Parece que solo estás configurando restricciones centerX y centerY que no establecerán scrollviews contentSize a lo que necesites.

Intente configurar estos progtwigs (este es un pseudocódigo pero obtendrá la idea):

  • view1.topConstraint = scrollView.topConstraint
  • view1.leftConstraint = scrollView.leftConstraint
  • view3.bottomConstraint = scrollView.bottomConstraint
  • view3.rightConstraint = scrollView.rightConstraint

Si configura todos esos correctamente, su scroll scroll se desplazará correctamente. Solo recuerde verificar el contenido, y si el contenido es 0.0, entonces sus restricciones no están configuradas correctamente.