Mam UIScrollView z 2 subviews. Chciałbym, aby jedno wyeksponowanie było "wyrównane względem linii prowadzącej" (wyrównane do lewej), gdzie jego krawędź wiodąca pokrywa się z wiodącą krawędzią przewijania. Chciałbym, aby drugi widok był wyrównany do tyłu (wyrównany do prawej), gdzie jego końcowa krawędź jest wyrównana z końcową krawędzią przewijania.Subview nie wyrówna krawędzi końcowej do jej obiektu nadrzędnego. UIScrollView
Z jakiegoś powodu funkcja autolayout nieoczekiwanie umieszcza drugi, wyrównywany w kierunku pionowym widok podz góry poza obrębem przewijania, na przednią (lewą) stronę drugiego podglądu, tak że końcowa krawędź wynurzania jest wyrównana do krawędzi wiodącej z przewijania.
Próbuję zrobić to programowo. Kod znajduje się poniżej. Używam 2 etykiet dla 2 subviews. Etykieta "alpha" jest prawidłowo wyrównana do początku, ale etykieta "beta" nie jest wyrównana do tyłu, tak jak powinna być.
Dzieje się tak również, jeśli spróbuję użyć wyrównania w lewo i w prawo zamiast przedniego i końcowego. Etykieta wyrównana do prawej pojawia się w tym samym niepoprawnym miejscu, co etykieta wyrównana do tyłu.
Przeczytałem kilka informacji o wydaniu i iOS 6 tutaj i gdzie indziej wiele razy i po prostu nie jestem pewien, dlaczego tak się dzieje.
W regulatorze Widok:
- (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]];
}
Dla odniesienia, wyjście ze sterownika widzenia widoku za recursiveDescription kopię zapasową ukośne położenie:
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>>
Mam dokładnie ten sam problem (chociaż używam narzędzi C# MonoTouch zamiast obj-c). Tworzę bardzo proste przykłady przy użyciu widoków utworzonych programowo i nie mogę ich dostosować do prawej strony UIScrollView przy użyciu autolayout. Czy miałeś jakieś szczęście, żeby to zrozumieć? – Camputer