2014-02-10 19 views
5

Ich habe eine Ansicht, die programmgesteuert eine Unteransicht erstellt und einige Einschränkungen hinzugefügt. Aus irgendeinem Grund werden die Einschränkungen vollständig ignoriert. Es wird kein Fehler ausgegeben. Die Einschränkungen werden einfach nicht wirksam. Die Unteransicht hat denselben Rahmen wie ihre Superansicht. Ich erwarte es 400x400 und zentriert in seiner Superview. Was mache ich hier falsch? Hier ist meine Initwithframe in der Superview:Warum ignoriert meine programmgesteuerte Ansicht ihre Einschränkungen?

- (id) initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) 
    { 
     instructionsView = [[UIView alloc] initWithFrame:frame]; 
     [self addSubview:instructionsView]; 
     [self bringSubviewToFront:instructionsView]; 

     [self addConstraint:[NSLayoutConstraint constraintWithItem:instructionsView 
                 attribute:NSLayoutAttributeCenterX 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:self 
                 attribute:NSLayoutAttributeCenterX 
                 multiplier:1. 
                  constant:0]]; 

     [self addConstraint:[NSLayoutConstraint constraintWithItem:instructionsView 
                 attribute:NSLayoutAttributeCenterY 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:self 
                 attribute:NSLayoutAttributeCenterY 
                 multiplier:1. 
                  constant:0]]; 

     [instructionsView addConstraint:[NSLayoutConstraint constraintWithItem:instructionsView 
                    attribute:NSLayoutAttributeWidth 
                    relatedBy:NSLayoutRelationEqual 
                     toItem:nil 
                    attribute:NSLayoutAttributeNotAnAttribute 
                    multiplier:1. 
                     constant:400]]; 

     [instructionsView addConstraint:[NSLayoutConstraint constraintWithItem:instructionsView 
                    attribute:NSLayoutAttributeHeight 
                    relatedBy:NSLayoutRelationEqual 
                     toItem:nil 
                    attribute:NSLayoutAttributeNotAnAttribute 
                    multiplier:1. 
                     constant:400]]; 
    } 
    return self; 
} 

ich versucht habe, zu ändern

instructionsView = [[UIView alloc] initWithFrame:frame]; 

zu

instructionsView = [[UIView alloc] initWithFrame:CGRectZero]; 

ohne Erfolg.

Antwort

9

Sie müssen der Ansicht sagen, nicht die automatischen Maske basiertes Layout und stattdessen automatisches Layout

instructionsView.translatesAutoresizingMaskIntoConstraints = NO; 

Siehe documentation here

Auch die Ansicht verwenden sollte ohne Rahmen geschaffen wird, ist dies meist ein Stil, aber erstellen Sie Ihre Ansicht wie folgt:

instructionsView = [[UIView alloc] init]; 
2

Mehrdeutigkeit kann zu überraschenden Ergebnissen führen, ohne eine Ausnahme zu erheben. Um Debug-Einschränkungen für Mehrdeutigkeit, Pause im Debugger und Typ an der LLDB Befehlszeile:

po [[UIWindow keyWindow] _autolayoutTrace] 

Auch Sie können (und sollten) fügen Sie eine Methode (durch eine Kategorie) auf UIView, die Sie hasAmbiguousLayout nennen wir rekursiv Die Hierarchie.

Schließlich können (und sollten) Sie eine Methode (über eine Kategorie) in UIView hinzufügen, mit der Sie constraintsAffectingLayoutForOrientation: rekursiv in der Hierarchie aufrufen können.

Auf diese Weise können Sie aufspüren, was wirklich passiert.

Verwandte Themen