Ich möchte in die Tiefen des Auto-Layout gehen und so will ich es programmatisch zu tun, um es richtig zu verstehen.Ich weiß, wie man es durch Storyboard ziemlich gut.Nun hier ist was ich tut (in viewDidAppear:
)AutoLayout programmatisch nicht funktioniert
-(void)scenario2{
PGView *viewA = [[PGView alloc]initWithFrame:CGRectMake(100, 100, 100, 100) andBackgroundColor:[UIColor blackColor]];
[self.view addSubview:viewA];
PGView *viewB = [[PGView alloc]initWithFrame:CGRectMake(200, 300, 100, 100) andBackgroundColor:[UIColor yellowColor]];
[self.view addSubview:viewB];
viewA.translatesAutoresizingMaskIntoConstraints = NO;
viewB.translatesAutoresizingMaskIntoConstraints = NO;
NSLayoutConstraint *constraint;
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[viewB(==100)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewB)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[viewB(==100)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewB)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[viewA(==200)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewA)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[viewA(==200)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewA)]];
//problem statement
constraint = [NSLayoutConstraint constraintWithItem:viewA attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:viewB attribute:NSLayoutAttributeWidth multiplier: 3.0f constant: 0.0f];
[self.view addConstraint:constraint];
NSLog(@"%@",viewA);
NSLog(@"%@",viewB);
}
So, hier habe ich zwei Ansichten mit verschiedenen Farben initialisiert.
Ich weiß, dass ich die Eigenschaft festlegen muss.
translatesAutoresizingMaskIntoConstraints
zuNO
bevor Sie neue Einschränkungen anwenden. Also ich habe das getan.Jetzt gebe ich die Höhen und Breiten der beiden Ansichten an. So sind die x_position und y_position für beide Ansichten 0. Ich führe den Code und ich bekomme das erwartete Ergebnis. Beide Ansichten haben die angegebene Höhe und Breite am Punkt (0,0).
Problem
Nun, wenn ich die Aussage "Problemstellung" schreibe die Breite ViewB entsprechend der Breite der ViewA einzustellen, seine nicht funktioniert.
Wenn ich Ansichten viewA und viewB drucke, druckt es auch die Frames als (0,0,0,0).
Kann mir jemand dieses Verhalten erklären?
Edit: Hier sind einige Änderungen, die ich made.I haben haben die Zweideutigkeit der beiden die Ansichten mit ‚hasAmbiguousLayout‘ und seine adaequat now.Now geprüft, was der nächste Schritt sein sollte, wenn ich ViewB ist, um die Größe wollen Breite dreimal der Breite von viewA?
ok ich versuchen, es zu beheben und in einem Augenblick zu antworten. – Reckoner
Ich habe meine Frage mit einigen Änderungen in meinem Code aktualisiert. Können Sie das bitte erklären? – Reckoner
@Reckoner - OK, also, wie oben in meinem Code-Ausschnitt, entfernen Sie die Breite Definition von der VFL für A, und dann können Sie Ihre Multiplikator-Einschränkung verwenden. Nun habe ich die Einschränkungen für Anfang und Ende definiert (die ich aus dem Versuch, den Rahmen zu setzen, abgeleitet habe), die Sie bei Ihrer Bearbeitung nicht verwendet haben, aber hoffentlich ist dies noch klar genug, um meinen Standpunkt zu verdeutlichen. – Rob