ฉันมี UIView
และตั้งข้อ จำกัด โดยใช้ Xcode Interface Builder
ตอนนี้ฉันต้องการอัปเดตสิ่งนั้น UIView
ค่าคงที่ความสูงของอินสแตนซ์นั้นโดยทางโปรแกรม
มีฟังก์ชั่นที่เหมือนmyUIView.updateConstraints()
แต่ไม่รู้จะใช้ยังไง
ฉันมี UIView
และตั้งข้อ จำกัด โดยใช้ Xcode Interface Builder
ตอนนี้ฉันต้องการอัปเดตสิ่งนั้น UIView
ค่าคงที่ความสูงของอินสแตนซ์นั้นโดยทางโปรแกรม
มีฟังก์ชั่นที่เหมือนmyUIView.updateConstraints()
แต่ไม่รู้จะใช้ยังไง
คำตอบ:
เลือกข้อจำกัดความสูงจากตัวสร้างอินเทอร์เฟซและใช้ทางออกของมัน ดังนั้นเมื่อคุณต้องการเปลี่ยนความสูงของมุมมองคุณสามารถใช้รหัสด้านล่างนี้
yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()
วิธีการเป็นวิธีการที่ตัวอย่างของupdateConstraints()
UIView
จะมีประโยชน์เมื่อคุณตั้งค่าข้อ จำกัด โดยใช้โปรแกรม จะอัปเดตข้อ จำกัด สำหรับมุมมอง สำหรับรายละเอียดเพิ่มเติมคลิกที่นี่
หากคุณมีมุมมองที่มีข้อ จำกัด หลายประการวิธีที่ง่ายกว่ามากโดยไม่ต้องสร้างร้านค้าหลายแห่ง ได้แก่
ในตัวสร้างอินเทอร์เฟซให้ระบุข้อ จำกัด แต่ละข้อที่คุณต้องการแก้ไขตัวระบุ:
จากนั้นในโค้ดคุณสามารถแก้ไขข้อ จำกัด หลายอย่างดังนี้:
for constraint in self.view.constraints {
if constraint.identifier == "myConstraint" {
constraint.constant = 50
}
}
myView.layoutIfNeeded()
คุณสามารถกำหนดข้อ จำกัด หลายตัวให้เป็นตัวระบุเดียวกันซึ่งจะช่วยให้คุณสามารถจัดกลุ่มข้อ จำกัด เข้าด้วยกันและแก้ไขทั้งหมดได้ในครั้งเดียว
เปลี่ยนHeightConstraint
และโดยไม่ต้องสร้างWidthConstraint
IBOutlet
หมายเหตุ:กำหนดข้อ จำกัด ด้านความสูงหรือความกว้างในไฟล์ Storyboard หรือ XIB หลังจากดึงข้อ จำกัด นี้โดยใช้ส่วนขยายนี้
คุณสามารถใช้ส่วนขยายนี้เพื่อดึงข้อ จำกัด ด้านความสูงและความกว้าง:
extension UIView {
var heightConstraint: NSLayoutConstraint? {
get {
return constraints.first(where: {
$0.firstAttribute == .height && $0.relation == .equal
})
}
set { setNeedsLayout() }
}
var widthConstraint: NSLayoutConstraint? {
get {
return constraints.first(where: {
$0.firstAttribute == .width && $0.relation == .equal
})
}
set { setNeedsLayout() }
}
}
คุณสามารถใช้ได้:
yourView.heightConstraint?.constant = newValue
first(where: ...)
คุณสามารถใช้ได้ทันทีแทนfilter
+first
ลากข้อ จำกัด ไปยัง VC ของคุณเป็น IBOutlet จากนั้นคุณสามารถเปลี่ยนค่าที่เกี่ยวข้อง (และคุณสมบัติอื่น ๆ ตรวจสอบเอกสารประกอบ):
@IBOutlet myConstraint : NSLayoutConstraint!
@IBOutlet myView : UIView!
func updateConstraints() {
// You should handle UI updates on the main queue, whenever possible
DispatchQueue.main.async {
self.myConstraint.constant = 10
self.myView.layoutIfNeeded()
}
}
คุณสามารถอัปเดตข้อ จำกัด ของคุณด้วยภาพเคลื่อนไหวที่ราบรื่นได้หากต้องการดูส่วนของโค้ดด้านล่าง:
heightOrWidthConstraint.constant = 100
UIView.animate(withDuration: animateTime, animations:{
self.view.layoutIfNeeded()
})
หากวิธีการข้างต้นไม่ได้ผลโปรดตรวจสอบให้แน่ใจว่าคุณได้อัปเดตในบล็อก Dispatch.main.async {} คุณไม่จำเป็นต้องเรียกใช้เมธอด layoutIfNeeded () แล้ว
ขั้นแรกให้เชื่อมต่อข้อ จำกัด ความสูงเข้ากับตัวควบคุมมุมมองของเราเพื่อสร้าง IBOutlet ดังที่แสดงในโค้ดด้านล่าง
@IBOutlet weak var select_dateHeight: NSLayoutConstraint!
จากนั้นใส่โค้ดด้านล่างในมุมมองไม่โหลดหรืออยู่ในการกระทำใด ๆ
self.select_dateHeight.constant = 0 // we can change the height value
หากอยู่ในปุ่มคลิก
@IBAction func Feedback_button(_ sender: Any) {
self.select_dateHeight.constant = 0
}
ในการอัปเดตข้อ จำกัด ของโครงร่างคุณจะต้องอัพเดตคุณสมบัติคงที่และเรียกใช้ layoutIfNeeded after
myConstraint.constant = newValue
myView.layoutIfNeeded()
Create an IBOutlet of NSLayoutConstraint of yourView and update the constant value accordingly the condition specifies.
//Connect them from Interface
@IBOutlet viewHeight: NSLayoutConstraint!
@IBOutlet view: UIView!
private func updateViewHeight(height:Int){
guard let aView = view, aViewHeight = viewHeight else{
return
}
aViewHeight.constant = height
aView.layoutIfNeeded()
}