tomar retrato profesionales plus normal modo fotos con como iphone ios ios6 storyboard nslayoutconstraint

profesionales - modo retrato iphone 8



Dos vistas, una debajo de otra en retrato y lado a lado en el paisaje usando restricciones de diseƱo (3)

Supongamos que tengo dos vistas de texto. En el modo vertical, quiero que estén debajo de otra & En el modo horizontal, quiero que estén uno al lado del otro

¿Es posible hacer eso usando restricciones de diseño en el guión gráfico usando el autodiseño? ¿Si es así, entonces cómo? Si no, ¿cuál sería la otra mejor solución para lograr esto?

ios6 es mi versión de destino


Así es como puedes hacerlo en el código.

Básicamente, necesitas:

a) configure los NSLayoutConstraint apropiados para la orientación dada en updateViewConstraints en su UIViewController .

b) llame [self.view setNeedsUpdateConstraints] cuando la interfaz gire.

A continuación se muestra una implementación de ViewController y una categoría en UIView con métodos de ayuda.

@interface ConstraintsViewController () @property (nonatomic, weak) IBOutlet UIView *upperOrLeftView, *lowerOrRightView; @end @implementation ConstraintsViewController -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; [self.view setNeedsUpdateConstraints]; } -(void)updateViewConstraints { [super updateViewConstraints]; [self.view removeConstraintsRelatingToItems:@[self.upperOrLeftView,self.lowerOrRightView]]; if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) { [self.view constrainSubview:self.upperOrLeftView usingEdgeInsets:UIEdgeInsetsMake(0, 0, -1, 0)]; [self.view constrainSubview:self.lowerOrRightView usingEdgeInsets:UIEdgeInsetsMake(-1, 0, 0, 0)]; [self.view constrainSubviewsTopToBottom:@[self.upperOrLeftView, self.lowerOrRightView]]; } else { [self.view constrainSubview:self.upperOrLeftView usingEdgeInsets:UIEdgeInsetsMake(0, 0, 0, -1)]; [self.view constrainSubview:self.lowerOrRightView usingEdgeInsets:UIEdgeInsetsMake(0, -1, 0, 0)]; [self.view constrainSubviewsLeftToRight:@[self.upperOrLeftView, self.lowerOrRightView]]; } } @end

Pon esto en UIView + Constraints.h

@interface UIView (Constraints) -(void)removeConstraintsRelatingToItems:(NSArray*)items; -(void)constrainSubview:(UIView*)subview usingEdgeInsets:(UIEdgeInsets)insets; -(void)constrainSubviewsLeftToRight:(NSArray*)subviews; -(void)constrainSubviewsTopToBottom:(NSArray*)subviews; @end

Esto es UIView + Constraints.m

@implementation UIView (Constraints) -(void)removeConstraintsRelatingToItems:(NSArray *)items { for(NSLayoutConstraint *constraint in self.constraints) { if([items containsObject:constraint.firstItem] || [items containsObject:constraint.secondItem]) { [self removeConstraint:constraint]; } } } /** Set up constraints to flow the subviews from top to bottom and with equal heights */ -(void)constrainSubviewsTopToBottom:(NSArray*)subviews { if(subviews.count > 1) { UIView *anchorView = subviews[0]; for(int i = 1; i < subviews.count; i++) { UIView *view = subviews[i]; NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:anchorView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeHeight multiplier:1.0 constant:0.0]; NSLayoutConstraint *edgesConstraint = [NSLayoutConstraint constraintWithItem:anchorView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]; [self addConstraints:@[heightConstraint, edgesConstraint]]; anchorView = view; } } } /** Set up constraints to flow the subviews from left to right and with equal widths */ -(void)constrainSubviewsLeftToRight:(NSArray*)subviews { if(subviews.count > 1) { UIView *anchorView = subviews[0]; for(int i = 1; i < subviews.count; i++) { UIView *view = subviews[i]; NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:anchorView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]; NSLayoutConstraint *edgesConstraint = [NSLayoutConstraint constraintWithItem:anchorView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]; [self addConstraints:@[widthConstraint, edgesConstraint]]; anchorView = view; } } } /** Set up constraints to anchor the various edges of the subview to it''s superview (this view) using the provided insets. Any inset set to < 0.0 means that edge is ignored; */ -(void)constrainSubview:(UIView*)subview usingEdgeInsets:(UIEdgeInsets)insets { if(insets.top >= 0.0) { [self addConstraint:[NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:insets.top]]; } if(insets.right >= 0.0) { [self addConstraint:[NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeRight multiplier:1.0 constant:-insets.right]]; } if(insets.bottom >= 0.0) { [self addConstraint:[NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-insets.bottom]]; } if(insets.left >= 0.0) { [self addConstraint:[NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeft multiplier:1.0 constant:insets.left]]; } } @end


En mi opinión, la mejor forma de mostrar las vistas de viewController en más de una orientación es crear pocas vistas para cada orientación. Aquí he encontrado esto:

"Cuando agrega un controlador de vista al guión gráfico, viene con una vista. Llame a la vista de contenedor. Agregue dos vistas a la vista de contenedor: una vista de retrato y una vista de paisaje. Establezca la dimensión de la vista de retrato y la vista de paisaje de manera apropiada. usando el inspector de tamaño. Agregue botones, más vistas, etiquetas o lo que sea a las vistas de retrato y paisaje según sea necesario para su aplicación. Luego, cuando la orientación cambie, oculte una vista y muestre la otra ".


Puede lograr dicho comportamiento utilizando solo Interface Builder. Debe configurar algunas restricciones con diferentes prioridades.

Vea mi respuesta más detallada sobre el tema aquí . También hay un screencast y un enlace a una aplicación de ejemplo que he creado.