2017-10-14 42 views
2

我學習的自動佈局錨,並試圖實現這種簡單的事情編程需要更多關於自動佈局錨援助

enter image description here

在這裏,我的代碼

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(true) 

    let view1 = UIView() 
    view1.backgroundColor = .brown 
    blueView.addSubview(view1) 

    view1.translatesAutoresizingMaskIntoConstraints = false 
    view1.topAnchor.constraint(equalTo: blueView.topAnchor, constant:10).isActive = true 
    view1.bottomAnchor.constraint(equalTo: blueView.bottomAnchor, constant:10).isActive = true 
    view1.leadingAnchor.constraint(equalTo: blueView.leadingAnchor, constant:10).isActive = true 
    view1.trailingAnchor.constraint(equalTo: blueView.trailingAnchor, constant:10).isActive = true 
    view1.heightAnchor.constraint(equalToConstant: 80).isActive = true 
    view1.widthAnchor.constraint(equalToConstant: 80).isActive = true 
} 

而這就是我得到

enter image description here

什麼問題?

+0

請將圖像,而不是一個鏈接。 – shallowThought

+0

你期待什麼結果?在沒有建立測試項目的情況下,事情看起來對我來說很合適 - 您將前導/尾隨和頂部/底部錨點設置爲將藍色錨點向下和向右偏移10分。 *有*衝突:藍色的寬度/高度是100,似乎你正在試圖使棕色的寬度/高度80.但是,這可能意味着佈局引擎打破這兩個,因爲他們衝突的底部/尾隨約束。 (爲什麼我這麼說?因爲結果。)順便說一下,你有沒有檢查控制檯是否有任何衝突? – dfd

+0

還有一個項目 - 我只注意到你正在將棕色視圖變成藍色視圖的子視圖。如果您希望剪裁棕色視圖以始終保持藍色視圖的邊界,請設置該標誌。否則,您可以獲得公佈的結果。 – dfd

回答

0

試着這樣做:

override func viewWillAppear(_ animated: Bool) { 
super.viewWillAppear(true) 

let view1 = UIView() 
view1.backgroundColor = .brown 
view.addSubview(view1) 

view1.translatesAutoresizingMaskIntoConstraints = false 

//Constraints 
let centerXConstraint = view1.centerXAnchor.constraint(equalTo: self.view.centerXAnchor, constant: 0) 
let centerYConstraint = view1.centerYAnchor.constraint(equalTo: self.view.centerYAnchor, constant: 0) 
let widthConstraint = view1.widthAnchor.constraint(equalToConstant: 100) 
let heightConstraint = view1.heightAnchor.constraint(equalToConstant: 100) 

//Apply constraints 
constraintToApply.append(centerXConstraint) 
constraintToApply.append(centerYConstraint) 
constraintToApply.append(widthConstraint) 
constraintToApply.append(heightConstraint) 
} 

,並添加下面的代碼:

override func viewDidAppear(_ animated: Bool) { 

    // Apply Constraints 
    NSLayoutConstraint.activate(constraintToApply) 
    self.view.layoutIfNeeded() 
} 

希望這可以幫助你。

+0

請再次查看我的問題我修改了它。 –

1

怎麼回事?

我看到三類問題:

  1. 有些約束是不活躍的。 heightAnchorwidthAnchor約束尚未設置,因此isActive = true
  2. 約束有衝突。您基於常量設置約束,而不考慮超視圖的尺寸。這導致約束髮生衝突,例如,view1不可能是來自底部錨點的頂點的頂點和頂點的263點,而是全部在同一時間。
  3. 基於常量的約束通常無法將視圖居中在屏幕上,因爲屏幕大小差別很大。

這裏是一個可能的解決這三個問題:

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(true) 

    let view1 = UIView() 
    view1.backgroundColor = .brown 
    view.addSubview(view1) 

    view1.translatesAutoresizingMaskIntoConstraints = false 
    view1.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
    view1.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 
    view1.heightAnchor.constraint(equalToConstant: 100.0).isActive = true 
    view1.widthAnchor.constraint(equalToConstant: 100.0).isActive = true 
} 

在這裏,我們已成立的上海華盈的view1等於X和Y中心的X和Y中心,定義的高度和寬度爲view1作爲常量,並將所有相關約束設置爲活動狀態。

您可以在Auto Layout Guide中找到其他解決方案。

+0

@Pursuingperfection我相信你添加到頂部/底部/前導/尾隨約束的10個點常量是問題的根源。用'view1.topAnchor.constraint(equalTo:blueView.topAnchor).isActive = true'替換'view1.topAnchor.constraint(equalTo:blueView.topAnchor,constant:10).isActive = true',正確地進行。 –

0

您爲每個約束添加+10分。

view1.topAnchor.constraint(equalTo: blueView.topAnchor, constant:10).isActive = true 

這意味着「設置視圖1的頂部主播藍景的頂部錨加10」

只是刪除constant:10

view1.topAnchor.constraint(equalTo: blueView.topAnchor).isActive = true 

如果你設置上,下,左,領導和尾隨的錨,你不應該設置高度和寬度。寬度和高度將根據這4個錨點進行計算。所以,你應該刪除

view1.heightAnchor.constraint(equalToConstant: 80).isActive = true 
view1.widthAnchor.constraint(equalToConstant: 80).isActive = true