2015-08-26 9 views
5

Mam okrąg na środku ekranu z ograniczeniem marginesu 50 na jednym z końców. Dlatego szerokość koła zależy od wielkości ekranu.Uzyskiwanie wysokości widoku w oparciu o ograniczenia marginesów po uruchomieniu Swift

Więc, co starałem się następująco:

Approach 1

skonfigurować marginesy w serii ujęć, aby określić szerokość koła (50 na lewy i prawy)

Potem używany następujący kod:

@IBOutlet weak var helpButHeight: NSLayoutConstraint! 
@IBOutlet weak var helpBut: UIButton! 

viewDidLoad:

helpButHeight.constant = helpBut.frame.size.width 

To nie działało.

Ponieważ szerokość ekranu jest 400, a marża jest 50 na obu końcach, a następnie helpBut.frame.size.width powinien dać mi 300.

Zamiast tego dała mi 46.

Podejście 2

To był mój obejście:

viewDidLoad:

let screenSize: CGRect = UIScreen.mainScreen().bounds 
    helpButHeight.constant = screenSize.width - 100 

ponieważ 100 = 50 + 50, dwa marginesy.

Działa dobrze!

Pytanie

Dlaczego mam to zrobić? Dlaczego pierwsze podejście nie działa? Dlaczego 46, a nie 300?

+0

Czy robisz to 'helpButHeight.constant = helpBut.frame.size.width' w swoim' viewDidLoad'? –

+0

Tak, przepraszam, wyjaśnię to. –

+0

Co nie wystarczy ustawić Proporcje proporcji na 1: 1, a następnie ustawić ograniczenia wiodące i końcowe na 50, a można wyśrodkować w pionie? – EridB

Odpowiedz

14

Powód jest taki, że ograniczenia nie zostały uruchomione w funkcji viewDidLoad. Cykl życia wygląda coś

  • viewDidLoad - Ograniczenia nie ustawiono
  • viewWillAppear - Ograniczenia nie ustawiono
  • viewWillLayoutSubviews - Ograniczenia ustawiania
  • viewDidLayoutSubviews - Ograniczenia są ustawione
  • viewDidAppear - Ograniczenia są ustawione
+0

Świetne, więc powinienem zasadniczo przenieść mój kod do 'viewDidLayout' –

+0

tak, to byłoby jedno z poprawnych miejsc. –

+0

Z wyjątkiem tego, że nazywa się 'viewDidLayoutSubviews' –

0

Jeśli chcesz, aby każdy widok był w środku, po prostu umieść ograniczenie w poziomie/pionie centrum ... Nie jest wymagany kod. Jeśli chcesz mieć dopełnienie, po prostu umieść lewy i prawy ogranicznik ... Wystarczy przypomnieć, że nie używasz obu one razem ... To się złamie ...