automatische lay-out – maak hoogte van weergave relatief aan halve superview-hoogte

Ik ben de laatste tijd bezig met automatische lay-outs en ik zit vast bij wat lijkt op een echt triviaal probleemvoorbeeld. Ik heb een uitzicht dat ik boven aan het scherm wil zitten en de helft van de schermhoogte wil innemen. Eenvoudig vóór automatische lay-out – plak het gewoon op zijn plaats en vertel het om verticaal uit te breiden wanneer het formaat van de superview wordt gewijzigd.

Nu, ik kan voor mijn leven niet zien hoe ik het moet doen. Dit krijg ik als ik dit probeer in te stellen:

De onderste ruimtebeperking is ingesteld op “gelijk aan 284”, wat absoluut en absoluut nutteloos voor mij is wanneer ik overschakel naar de iPhone4-lay-out, omdat het 284 punten ruimte aan de onderkant van het scherm behoudt en de weergave verkleint tot niet langer half zo groot zijn als het scherm. En er is geen manier om die beperking zo in te stellen dat deze gelijk is aan een fractie van de hoogte van een ander beeld..

Na een tijdje worstelen, is de enige manier die ik kan bedenken om dit te doen, een ander aanzicht onder dit aanzicht te introduceren, hun hoogten gelijk vast te zetten, ze boven en onder elkaar te laten zitten en dan het tweede (onderste) aanzicht in te stellen onzichtbaar zijn.. wat een beetje lelijk lijkt!

Mis ik iets voor de hand liggends?..


Antwoord 1, autoriteit 100%

Storyboard-oplossing waar u de exacte verhouding tussen weergaven kunt instellen:

Nu:

WINST!!!

P.S. Merk ook op dat deze methode werkt met weergaven op verschillende nestingniveaus en (uiteraard) toepasbaar voor breedte

P.P.S. soms kan het handig zijn om “eerste en tweede item” van de beperking om te keren of een omgekeerde multiplier in te stellen (bijvoorbeeld 2 in plaats van 0,5) (maar deze methoden zijn niet handig als u niet begrijpt hoe weergaven met elkaar verband houden).


Antwoord 2, autoriteit 91%

Dit is nu mogelijk in IB vanaf [minstens] Xcode 5.1.1. Hoewel het even duurde voordat ik erachter kwam dat het eigenlijk supereenvoudig is:

Maak eerst een basisbeperking voor uitlijning aan de bovenkant (u moet ook beperkingen voor onder, links en rechts instellen, zoals normaal)
. Selecteer vervolgens de beperking en ga naar het infovenster Kenmerk:

Vervolgens kun je de vermenigvuldiger aanpassen. Als u 50% van de superweergave wilt, laat u deze op 1staan, aangezien deze is uitgelijnd op het midden van de super. Dit is ook een geweldige manier om weergaven te maken die ook andere percentages zijn (zoals 25% van superweergave)


Antwoord 3, autoriteit 16%

Na wat meer tijd ben ik op het volgende gekomen.

Ik noteer het als een antwoord, maar het is niet erg bevredigend, omdat het ervan uitgaat dat je dit niet echt in Interface Builder kunt doen, maar de juiste beperking kan achteraf in de code worden toegevoegd als:

- (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];
}

Kortom, het stelt een vermenigvuldiger van 0,5 in op de hoogte van self.view, handelend op bovenaanzicht.
Ik moest de prioriteit van de onderste verticale ruimtebeperking in IB instellen op lager dan 1000 om ook een heleboel runtime-berichten over het doorbreken van beperkingen te voorkomen.

Dus als iemand kan laten zien hoe dit te doen in Interface Builder, zou dat beter mijn vraag beantwoorden, anders denk ik dat dit zo goed mogelijk is (voorlopig)???


Antwoord 4, autoriteit 5%

Iets eenvoudiger en eenvoudiger dan de methode dan het antwoord van Fjodor Volchyok.
-Houd de bedieningsknop ingedrukt en klik op de subweergave.
– Houd nog steeds de opdrachtknop ingedrukt, sleep de cursor naar de superview en klik vervolgens op de superview.
-Selecteer “Beeldverhouding”.

-Klik vervolgens op de Grootte Inspector.
– Dubbelklik vervolgens op de beperking.

-Zorg ervoor dat “hoogte” is geselecteerd voor beide items.

-Verander vervolgens de “Vermenigvuldiger” in 0,5 voor de helft van het scherm, of welk deel van het superview dan ook dat u wenst.


Antwoord 5, autoriteit 4%

Er is ook een andere mogelijkheid in de code voor het geval je 2 views hebt die beide dezelfde hoogte zouden moeten hebben: stel gewoon de hoogte van view2 in op de hoogte van view1 (de truc hier is niet expliciet de hoogte van view1 in te stellen).

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

Antwoord 6

Snelle versie van Mete’s antwoord:

   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)
}

Other episodes