autolayout - a face înălțime de vedere relative la o jumătate de superview înălțime

au fost obtinerea în autolayouts recent și am'm-a blocat pe ceea ce pare a fi o problemă banal exemplu. Am o părere că vreau să stau la partea de sus a ecranului, să-și ia o jumătate de ecran-înălțime. Simplu înainte autolayout - doar tac în loc și spune-l pentru a extinde vertical atunci când superview redimensionează.

Acum, nu pot't pentru viața de mine vezi cum să o facă. Aici's ceea ce primesc atunci când încerc să pun asta:

Spațiul de jos constrângere este setat la "este egal cu 284", care este absolută și absolut inutil pentru mine atunci când am schimba la iPhone4 aspect, așa cum se păstrează 284 puncte de spațiu în partea de jos a ecranului, și se micșorează în scopul de a nu mai fi jumătate din dimensiunea ecranului. Și acolo's nici un fel de setare care constrângerea la egalitate de o fracțiune de orice alt view's înălțime..

După ce se luptă pentru un timp, singurul mod de a face acest lucru ar fi să se introducă un alt punct de vedere de mai jos acest punct de vedere, pin înălțimile lor la fel, le sta mai sus și de mai jos de fiecare alte și apoi setați cel de-al doilea (jos) pentru a fi invizibil.. care pare un pic urât!

Am pierdut ceva evident?..

Comentarii la întrebare (1)

Rezumat soluție în cazul în care puteți seta raport exact între orice puncte de vedere:

Acum:

PROFIT!!!

P. S. de Asemenea, rețineți că această metodă funcționează cu vedere pe diferite niveluri de imbricare și (evident) aplicabile pentru lățime

P. P. S. uneori s-ar putea fi de ajutor pentru a "inversa primul și al doilea articol" de constrângere sau set inversă de multiplicare (de exemplu, 2, în loc de 0,5) (dar aceste metode nu sunt utile dacă nu't a înțelege modul în vedere se referă, între altele).

Comentarii (5)
Soluția

Acest lucru este acum posibil în IB ca de [cel puțin] Xcode 5.1.1. Deși mi-a luat cândva să-și dea seama că este de fapt foarte simplu:

În primul rând a crea o bază de sus aliniere constrângere (va, de asemenea, nevoie pentru a seta jos, stânga și dreapta, constrângeri, cum ar fi normal) . Apoi selectați constrângere și navigați la Atributul inspector:

Apoi puteți ajusta de multiplicare. Dacă doriți 50% din vedere super lăsați-l la 1, deoarece este aliniat pe super's centru. Acest lucru este, de asemenea, o modalitate foarte bună de a crea puncte de vedere care sunt alte procente prea (ca 25% din super view)

Comentarii (6)

După puțin timp mi-a mai'am venit cu următoarea.

Am'm remarcat ca un răspuns, dar's nu foarte satisfacatoare, deoarece se presupune că poate't face de fapt acest lucru în Interface Builder, dar corect constrângere poate fi adăugat în cod după aceea ca:

- (void) viewWillAppear:(BOOL)animated
{

    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:upperview
                                                                 attribute:NSLayoutAttributeHeight 
                                                                 relatedBy:0 
                                                                    toItem:self.view
                                                                 attribute:NSLayoutAttributeHeight
                                                                multiplier:.5 
                                                                  constant:0];
    [self.view addConstraint:constraint];

}

Practic, se stabilește un multiplicator de 0,5 împotriva înălțimea de sine.vedere, care acționează în upperview. Am avut de a seta prioritatea de jos spațiu vertical constrângere în IB la mai mici decât 1000, pentru a evita o grămadă de execuție mesaje despre rupere constrângeri la fel de bine.

Deci, dacă cineva poate arăta cum să facă acest lucru în Interface Builder, care ar răspunde mai bine la întrebarea mea, altfel cred că acest lucru este la fel de bun ca acesta devine (pentru acum)???

Comentarii (2)

Ușor mai ușor și mai direct decât metoda mult Fiodor Volchyok's a răspunde. -Țineți apăsat butonul de control și faceți clic pe subview. -Încă mai deține în jos de pe butonul de comandă, glisați cursorul la superview apoi faceți clic pe superview. -Selectați "Raport de Aspect".

-Apoi faceți clic pe Dimensiunea Inspector. -Apoi faceți dublu clic pe constrângere.

-Asigurați-vă că "h" este selectat pentru ambele elemente.

-Apoi schimba "Multiplicator" la 0,5 pentru o jumătate de ecran, sau orice fracțiune de superview doriti.

Comentarii (1)

Acolo am, de asemenea, o altă posibilitate în cod în cazul în care aveți 2 puncte de vedere care ar trebui să ambele au aceeași înălțime: doar setați înălțimea de view2 la înălțimea de view1 (trucul aici este setarea înălțimii de view1 în mod explicit).

    [self.view addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"V:[topLayoutGuide]-0-[_view1]-0-[_view2(==_view1)]-0-[bottomLayoutGuide]"
                            options:0
                            metrics:nil
                              views:viewsDict]];
Comentarii (2)

Swift versiune de Mete's răspuns:

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    upperView.translatesAutoresizingMaskIntoConstraints = false

    var constraint = NSLayoutConstraint(item: upperView,
                                        attribute: NSLayoutAttribute.top,
                                        relatedBy: NSLayoutRelation.equal,
                                        toItem: self.view,
                                        attribute: NSLayoutAttribute.top,
                                        multiplier: 1,
                                        constant: 0)

    self.view.addConstraint(constraint)

    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.height,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.height,
                                    multiplier: 0.5,
                                    constant: 0)

    self.view.addConstraint(constraint)

    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.leading,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.leading,
                                    multiplier: 1,
                                    constant: 0)

    self.view.addConstraint(constraint)

    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.trailing,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.trailing,
                                    multiplier: 1,
                                    constant: 0)

    self.view.addConstraint(constraint)

}
Comentarii (0)