Ho un UIScrollView con 2 subviews. Vorrei che una sottoview fosse "leading-aligned" (left-aligned) dove il suo leading edge si allineava con il leading edge della scrollview. Mi piacerebbe che l'altra sottoview fosse "allineata alla fine" (allineata a destra) dove il suo bordo posteriore si allinea con il bordo finale della scrollview.La sottoview non allineerà il bordo posteriore al suo padre UIScrollView
Per qualche motivo, l'autolayout mantiene inaspettatamente la seconda sottoview allineata alla fine, al di fuori dei limiti della scrollview, sul lato principale (a sinistra) dell'altro subview, in modo tale che il bordo finale della sottodirectory si allinea con il bordo principale della scrollview.
Sto provando a farlo a livello di programmazione. Il codice è sotto Sto usando 2 etichette per le 2 sottoview. L'etichetta "alpha" è correttamente allineata, ma l'etichetta "beta" non è allineata alla fine, come dovrebbe essere.
Questo succede anche se provo ad usare gli allineamenti sinistro e destro invece che all'inizio e alla fine. L'etichetta allineata a destra viene visualizzata nella stessa posizione errata dell'etichetta allineata alla fine.
Ho letto le note di rilascio di iOS 6 e le risposte qui e altrove molte volte e non sono sicuro del perché ciò stia accadendo.
Nel controller della vista:
- (void) viewDidLoad
{
[super viewDidLoad];
// Create and configure the scroll view.
UIScrollView * scrollView = [[UIScrollView alloc] init];
[scrollView setTranslatesAutoresizingMaskIntoConstraints:NO];
// For debugging.
[scrollView setClipsToBounds:NO];
scrollView.layer.borderColor = [UIColor redColor].CGColor;
scrollView.layer.borderWidth = 1.0;
[[self view] addSubview:scrollView];
// Layout scrollview.
// Horizontal: leading edge to superview's leading edge, with indent.
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:scrollView
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeLeading
multiplier:1.0
constant:20.0]];
// Horizontal: trailing edge to superview's trailing edge, with indent.
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:scrollView
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeTrailing
multiplier:1.0
constant:-20.0]];
// Vertical: top edge to superview's top edge, with indent.
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:scrollView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:20.0]];
// Vertical: bottom edge to superview's bottom edge, with indent.
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:scrollView
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:-20.0]];
// Create and configure first label which should be leading-aligned with scrollview.
UILabel * labelAlpha = [[UILabel alloc] init];
[labelAlpha setTranslatesAutoresizingMaskIntoConstraints:NO];
[labelAlpha setText:@"Alpha"];
[scrollView addSubview:labelAlpha];
// Layout first label.
// Horizontal: leading edge to scrollview's leading edge.
[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:labelAlpha
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:scrollView
attribute:NSLayoutAttributeLeading
multiplier:1.0
constant:0.0]];
// Vertical: top edge to scrollview's top edge.
[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:labelAlpha
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:scrollView
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:0.0]];
// Create and configure second label which should be trailing-aligned with scrollview.
UILabel * labelBeta = [[UILabel alloc] init];
[labelBeta setTranslatesAutoresizingMaskIntoConstraints:NO];
[labelBeta setText:@"Beta"];
[scrollView addSubview:labelBeta];
// Layout second label.
// Horizontal: trailing edge to scrollview's trailing edge.
[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:labelBeta
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:scrollView
attribute:NSLayoutAttributeTrailing
multiplier:1.0
constant:0.0]];
// Vertical: top edge to scrollview's top edge.
[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:labelBeta
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:scrollView
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:0.0]];
}
Per riferimento, l'uscita dal recursiveDescription di vista del controller della vista esegue il backup del disallineamento:
2013-07-15 22:04:23.892 Middleman[5669:907] <UIView: 0x20872960; frame = (0 0; 320 480); transform = [0, -1, 1, 0, 0, 0]; autoresize = RM+BM; layer = <CALayer: 0x20871e60>>
| <UIScrollView: 0x208718a0; frame = (20 20; 440 280); gestureRecognizers = <NSArray: 0x20871f20>; layer = <CALayer: 0x208728e0>; contentOffset: {0, 0}>
| | <UILabel: 0x20872ab0; frame = (0 0; 44 21); text = 'Alpha'; clipsToBounds = YES; userInteractionEnabled = NO; layer = <CALayer: 0x20872b90>>
| | <UILabel: 0x208730e0; frame = (-36 0; 36 21); text = 'Beta'; clipsToBounds = YES; userInteractionEnabled = NO; layer = <CALayer: 0x20873170>>
Ho lo stesso identico problema (anche se sto usando strumenti C# MonoTouch invece di obj-c). Sto creando esempi molto semplici usando viste create a livello di codice e non riesco a farle allineare sul lato destro di UIScrollView usando l'autolayout. Hai avuto fortuna a capirlo? – Camputer