Ich habe das automatische Layout für meine Ansichtssteuerungen verwendet. Ich habe die V- und H-Positionen in Einschränkungen festgelegt, möchte aber wissen, wie ich meine Tastengröße erhöhen kann, wenn sie auf 5s, 6 und 6 Plus geändert wird. Auf diese Weise habe ich Einschränkungen für die Anmeldeschaltfläche hinzugefügt:
NSArray *btncon_V=[NSLayoutConstraint constraintsWithVisualFormat:@"V:[btnLogin(40)]" options:0 metrics:nil views:viewsDictionary];
[btnLogin addConstraints:btncon_V];
NSArray *btncon_POS_H=[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[btnLogin]-100-|" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:btncon_POS_H];
NSArray *btncon_POS_V=[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-70-[Title]-130-[lblFirst]-0-[lblSecond]-20-[textusername]-10-[txtpassword]-10-[btnLogin]" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:btncon_POS_V];
Aber mein Problem ist, dass es zwar den linken und rechten Seitenabstand verwaltet, aber in iPhone 6 und 6 Plus gedehnt wird, da die Höhe festgelegt ist. Wie kann ich die Größe entsprechend der Bildschirmgröße erhöhen? Ich denke, dies könnte das Seitenverhältnis sein, aber wie kann ich die Seitenverhältnisbeschränkung im Code festlegen?
Antworten:
So was. Versuch es einmal.
[self.yourview setTranslatesAutoresizingMaskIntoConstraints:NO]; [self.yourview addConstraint:[NSLayoutConstraint constraintWithItem:self.yourview attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.yourview attribute:NSLayoutAttributeWidth multiplier:(self.yourview.frame.size.height / self.yourview.frame.size.width) constant:0]];
oder anstelle von können
(self.yourview.frame.size.height / self.yourview.frame.size.width)
Sie einen beliebigen Gleitkommawert verwenden. Vielen Dank.Swift 3.0 -
self.yourview!.translatesAutoresizingMaskIntoConstraints = false self.yourview!.addConstraint(NSLayoutConstraint(item: self.yourview!, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: self.yourview!, attribute: NSLayoutAttribute.width, multiplier: self.yourview.frame.size.height / self.yourview.frame.size.width, constant: 0))
quelle
[self.yourview setTranslatesAutoresizingMaskIntoConstraints:NO];
self.yourview.intrinsicContentSize
Layout-Anker sind die bequemste Möglichkeit, Einschränkungen programmgesteuert festzulegen.
Angenommen, Sie möchten ein Seitenverhältnis von 5: 1 für Ihre Schaltfläche festlegen, dann sollten Sie Folgendes verwenden:
button.heightAnchor.constraint(equalTo: button.widthAnchor, multiplier: 1.0/5.0).isActive = true
Hier ist der vollständige Code:
class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let button = UIButton(type: .custom) button.setTitle("Login", for: .normal) button.backgroundColor = UIColor.darkGray self.view.addSubview(button) button.translatesAutoresizingMaskIntoConstraints = false let margins = view.layoutMarginsGuide button.leadingAnchor.constraint(equalTo: margins.leadingAnchor, constant: 20.0).isActive = true button.trailingAnchor.constraint(equalTo: margins.trailingAnchor, constant: -20.0).isActive = true button.bottomAnchor.constraint(equalTo: margins.bottomAnchor, constant: -20.0).isActive = true button.heightAnchor.constraint(equalTo: button.widthAnchor, multiplier: 1.0/5.0).isActive = true } }
Hier sind die Ergebnisse, die mit dem oben geschriebenen Code erzielt wurden. Sie können sehen, dass die Schaltfläche das Seitenverhältnis von 5: 1 für verschiedene Geräte beibehält:
quelle
Swift 3:
yourView.addConstraint(NSLayoutConstraint(item: yourView, attribute: .height, relatedBy: .equal, toItem: yourView, attribute: .width, multiplier: 9.0 / 16.0, constant: 0))
quelle
aspectRatioConstraint.isActive = true
.width
als erstes Attribut? Das Ergebnis istattr2 * multiplier
, dass das Seitenverhältnis istwidth / height
.width = height * aspectRatio
Wenn wir also.height
das erste Attribut und das erste setzenaspectRatio
,multiplier
ist das Ergebnis vollständig umgekehrt.Sie können "Höhenbeschränkung" zur Entwurfszeit in Interface Builder festlegen. Aktivieren Sie einfach "Beim Erstellen entfernen" und es wird entfernt, wann die App ausgeführt wird.
Danach können Sie die Einschränkung "Seitenverhältnis" hinzufügen, z. B. in der viewDidLoad-Methode.
In Xamain.iOS für "16: 9" sieht es so aus:
this.ImageOfTheDay.AddConstraint(NSLayoutConstraint.Create( this.ImageOfTheDay, NSLayoutAttribute.Height, NSLayoutRelation.Equal, this.ImageOfTheDay, NSLayoutAttribute.Width, 9.0f / 16.0f, 0));
Oder wie Mahesh Agrawal sagte:
[self.ImageOfTheDay addConstraint:[NSLayoutConstraint constraintWithItem:self.ImageOfTheDay attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.ImageOfTheDay attribute:NSLayoutAttributeWidth multiplier:(9.0f / 16.0f) constant:0]];
quelle
Hilfserweiterung in UIView
extension UIView { func aspectRation(_ ratio: CGFloat) -> NSLayoutConstraint { return NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: self, attribute: .width, multiplier: ratio, constant: 0) } }
Und Verwendung ist:
view.aspectRation(1.0/1.0).isActive = true
quelle
.self
anstelle vonself
2 gesetzt. Und die Verwendung in Kommentaren sollteview.aspectRation(1.0/1.0).isActive = true
ich in Xcode 10.2.1 Swift 5 testen.Ich habe alle Antworten oben ausprobiert, aber nicht funktioniert, und dies ist meine Lösung mit Swift 3:
let newConstraint = NSLayoutConstraint(item: yourView, attribute: .width, relatedBy: .equal, toItem: yourView, attribute: .height, multiplier: 560.0/315.0, constant: 0) yourView.addConstraint(newConstraint) NSLayoutConstraint.activate([newConstraint]) NSLayoutConstraint.deactivate(yourView.constraints) yourView.layoutIfNeeded()
quelle
Für Ansichten gibt es Einschränkungen und auch Eigenschaften.
Das Seitenverhältnis ist eine Eigenschaft der Ansicht , sodass Sie es wie folgt im Inhaltsmodus festlegen können
imageView.contentMode = .scaleAspectFit
Dadurch wird erreicht, dass eine Ansicht beispielsweise die Verhältnisse nicht ändert, wenn
quelle
view.widthAnchor.constraint(equalTo: view.heightAnchor, multiplier: aspectRatio, constant: 0)
so erstellen