2015-07-10 10 views
25

Użyłem automatycznego układu mojego ViewControllers. Ustawiłem pozycje V i H w wiązaniach. ale chcę wiedzieć, jak zwiększyć rozmiar przycisku po zmianie na 5s, 6 i 6 plus. W ten sposób dodałem ograniczenia dla przycisku logowania.Jak ustawić ograniczenie współczynnika kształtu programowo w ios

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 mój problem polega na tym, kiedy zarządza lewą i prawą szczeliną. Jego szczypanie w iPhone 6 i 6 plus, ponieważ thehight jest naprawiony. Jak mogę zwiększyć rozmiar zgodnie z rozmiarem ekranu? Myślę, że to może być AspectRatio, ale jak ustawić ograniczenie proporcji w kodzie.

+2

Sprawdź tę odpowiedź: http://stackoverflow.com/a/12526630/3202193 –

Odpowiedz

51

Podoba mi się 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 w miejsce (self.yourview.frame.size.height/self.yourview.frame.size.width) można użyć dowolnej wartości zmiennoprzecinkowej. 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)) 
+0

Jego daje mi ten błąd Zakończenie aplikację należytej aby usunąć wyjątek "NSInternalInconsistencyException", powód: "Mnożnik nie jest skończony! To nielegalne. mnożnik: nan ' – IRD

+0

jeśli ustawisz tylko to ograniczenie, to nie będzie działać. musisz także ustawić inne ograniczenia wyrównania. i możesz podać wartość float w mnożniku.np. jeśli szerokość widoku wynosi 200, a wysokość wynosi 100, to mnożnik będzie wynosił 0,5 –

+0

Nie rozumiem, jak działa mnożnik. Jak to zrobić? – IRD

6

Można ustawić "height ograniczenie" w czasie projektowania interfejsu Builder. Po prostu zaznacz opcję "" Usuń w czasie kompilacji "i zostanie ona usunięta po uruchomieniu aplikacji.

enter image description here Po tym można dodać ograniczenie "Aspect Ratio", na przykład w metodzie viewDidLoad.

W Xamain.iOS na "16: 9", to wygląda to tak:

this.ImageOfTheDay.AddConstraint(NSLayoutConstraint.Create(
      this.ImageOfTheDay, 
      NSLayoutAttribute.Height, 
      NSLayoutRelation.Equal, 
      this.ImageOfTheDay, 
      NSLayoutAttribute.Width, 
      9.0f/16.0f, 
      0)); 

Albo, jak Mahesh Agrawal powiedział:

[self.ImageOfTheDay addConstraint:[NSLayoutConstraint 
           constraintWithItem:self.ImageOfTheDay 
           attribute:NSLayoutAttributeHeight 
           relatedBy:NSLayoutRelationEqual 
           toItem:self.ImageOfTheDay 
           attribute:NSLayoutAttributeWidth 
           multiplier:(9.0f/16.0f) 
           constant:0]]; 
9

Swift 3:

yourView.addConstraint(NSLayoutConstraint(item: yourView, 
              attribute: .height, 
              relatedBy: .equal, 
              toItem: yourView, 
              attribute: .width, 
              multiplier: 9.0/16.0, 
              constant: 0)) 
+1

Dla systemu iOS 8 i nowszych należy używać właściwości isActive obiektu NSLayoutConstraint zamiast wywoływać metodę addConstraint (:). 'aspectRatioConstraint.isActive = true' – dvdblk

2

Próbowałem wszystkich odpowiedzi powyżej, ale nie działało, a to jest moje rozwiązanie z szybkim 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() 
7

Layout Anchors to najwygodniejszy sposób ustawiania ograniczeń programowo.

Powiedzmy, że chcesz ustawić 5: 1 współczynnik kształtu dla przycisku należy użyć:

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 
    } 

} 

wyniki Here're osiągnąć powyższy kod napisany . Widać, że przycisk zachowuje 5: 1 współczynnik kształtu obrazu na różnych urządzeniach:

Result view