Użyłem automatycznego układu moich kontrolerów widoku. Ustawiłem pozycje V i H w ograniczeniach, ale chcę wiedzieć, jak mogę zwiększyć rozmiar mojego przycisku, gdy zmieni się na 5s, 6 i 6 Plus. W ten sposób dodałem ograniczenia dla przycisku logowania:
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];
Ale moim problemem jest to, że podczas gdy zarządza lewą i prawą szczeliną boczną, w iPhone 6 i 6 Plus jest rozciągany, ponieważ wysokość jest stała. Jak mogę zwiększyć rozmiar w zależności od rozmiaru ekranu? Myślę, że to może być współczynnik proporcji, ale jak mogę ustawić ograniczenie proporcji w kodzie?
Odpowiedzi:
Lubię to. Spróbuj raz.
[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]];
lub zamiast
(self.yourview.frame.size.height / self.yourview.frame.size.width)
ciebie możesz użyć dowolnej wartości typu float. Dzięki.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))
źródło
[self.yourview setTranslatesAutoresizingMaskIntoConstraints:NO];
self.yourview.intrinsicContentSize
Zakotwiczenia układu to najwygodniejszy sposób programowego ustawiania ograniczeń.
Powiedzmy, że chcesz ustawić współczynnik proporcji 5: 1 dla swojego przycisku, a następnie użyj:
button.heightAnchor.constraint(equalTo: button.widthAnchor, multiplier: 1.0/5.0).isActive = true
Oto pełny kod:
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 } }
Oto wyniki uzyskane przy użyciu kodu napisanego powyżej. Możesz zobaczyć, że przycisk zachowuje proporcje 5: 1 na różnych urządzeniach:
źródło
Swift 3:
yourView.addConstraint(NSLayoutConstraint(item: yourView, attribute: .height, relatedBy: .equal, toItem: yourView, attribute: .width, multiplier: 9.0 / 16.0, constant: 0))
źródło
aspectRatioConstraint.isActive = true
.width
jako pierwszego atrybutu? Wynik jest takiattr2 * multiplier
, że współczynnik proporcji towidth / height
, więcwidth = height * aspectRatio
jeśli umieścimy.height
atrybut na pierwszym atrybucie, aaspectRatio
namultiplier
drugim, wynik jest całkowicie odwrócony.Możesz ustawić „Ograniczenie wysokości” w czasie projektowania w programie Interface Builder. Po prostu zaznacz „Usuń w czasie kompilacji”, a zostanie ona usunięta, gdy aplikacja będzie działać.
Następnie możesz dodać ograniczenie „Aspect Ratio”, na przykład w metodzie viewDidLoad.
W Xamain.iOS dla „16: 9” wygląda to tak:
this.ImageOfTheDay.AddConstraint(NSLayoutConstraint.Create( this.ImageOfTheDay, NSLayoutAttribute.Height, NSLayoutRelation.Equal, this.ImageOfTheDay, NSLayoutAttribute.Width, 9.0f / 16.0f, 0));
Lub, jak powiedział Mahesh Agrawal :
[self.ImageOfTheDay addConstraint:[NSLayoutConstraint constraintWithItem:self.ImageOfTheDay attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.ImageOfTheDay attribute:NSLayoutAttributeWidth multiplier:(9.0f / 16.0f) constant:0]];
źródło
Rozszerzenie pomocnika na UIView
extension UIView { func aspectRation(_ ratio: CGFloat) -> NSLayoutConstraint { return NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: self, attribute: .width, multiplier: ratio, constant: 0) } }
A użycie to:
view.aspectRation(1.0/1.0).isActive = true
źródło
.self
zamiastself
2. A użycie w komentarzu powinno byćview.aspectRation(1.0/1.0).isActive = true
przetestowane w Xcode 10.2.1 Swift 5.Wypróbowałem wszystkie powyższe odpowiedzi, ale nie zadziałało, a to jest moje rozwiązanie ze 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()
źródło
W przypadku widoków istnieją ograniczenia, a także właściwości.
proporcje są właściwością widoku , więc można je ustawić w trybie zawartości, jak na przykład
imageView.contentMode = .scaleAspectFit
dzięki temu widok nie zmieni współczynników, jeśli na przykład
źródło
view.widthAnchor.constraint(equalTo: view.heightAnchor, multiplier: aspectRatio, constant: 0)
sposób