จะอัปเดตข้อจำกัดความสูงคงที่ของ UIView แบบเป็นโปรแกรมได้อย่างไร


104

ฉันมี UIViewและตั้งข้อ จำกัด โดยใช้ Xcode Interface Builder

ตอนนี้ฉันต้องการอัปเดตสิ่งนั้น UIViewค่าคงที่ความสูงของอินสแตนซ์นั้นโดยทางโปรแกรม

มีฟังก์ชั่นที่เหมือนmyUIView.updateConstraints()แต่ไม่รู้จะใช้ยังไง



คุณสามารถใช้ลิงค์นี้หรือลิงค์นี้เพื่ออ้างอิง
Amna Farhan

นี่คือวิธีการอัปเดตข้อ จำกัด เดียวหรือหลายข้อ stackoverflow.com/a/54171693/8861442
Sarath Kumar Rajendran

คำตอบ:


224

เลือกข้อจำกัดความสูงจากตัวสร้างอินเทอร์เฟซและใช้ทางออกของมัน ดังนั้นเมื่อคุณต้องการเปลี่ยนความสูงของมุมมองคุณสามารถใช้รหัสด้านล่างนี้

yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()

วิธีการเป็นวิธีการที่ตัวอย่างของupdateConstraints() UIViewจะมีประโยชน์เมื่อคุณตั้งค่าข้อ จำกัด โดยใช้โปรแกรม จะอัปเดตข้อ จำกัด สำหรับมุมมอง สำหรับรายละเอียดเพิ่มเติมคลิกที่นี่


60
วันนี้ฉันได้เรียนรู้ว่าข้อ จำกัด สามารถเปลี่ยนเป็นทางออกได้และจากที่นั่นฉันสามารถทำอะไรก็ได้ที่ฉันต้องการจะทำกับมัน ขอบคุณ
Chris Mikkelsen

@ParthAdroja พี่ช่วยดูคำถามของฉันได้ ไหมstackoverflow.com/questions/46034278/… ?
พฤษภาคม Phyu

ฉันไม่มีไฟล์ xib และจะตั้งค่า yourHeightConstraint ใน UIView แบบเป็นโปรแกรมได้อย่างไร
newszer

@newszer คุณต้องมองไปที่หัวข้ออื่นสำหรับstackoverflow.com/questions/31651022/…
Parth Adroja

ฉันได้ยินมาว่าเราควรเรียก layoutIfNeeded after change constant constraint ทำไม? และบางครั้งฉันเรียก layoutIfNeeded ภายใน viewWillLayoutSubviews และ viewDidLayoutSubviews เป็นไรไหม?
mnemonic23

110

หากคุณมีมุมมองที่มีข้อ จำกัด หลายประการวิธีที่ง่ายกว่ามากโดยไม่ต้องสร้างร้านค้าหลายแห่ง ได้แก่

ในตัวสร้างอินเทอร์เฟซให้ระบุข้อ จำกัด แต่ละข้อที่คุณต้องการแก้ไขตัวระบุ:

ป้อนคำอธิบายภาพที่นี่

จากนั้นในโค้ดคุณสามารถแก้ไขข้อ จำกัด หลายอย่างดังนี้:

for constraint in self.view.constraints {
    if constraint.identifier == "myConstraint" {
       constraint.constant = 50
    }
}
myView.layoutIfNeeded()

คุณสามารถกำหนดข้อ จำกัด หลายตัวให้เป็นตัวระบุเดียวกันซึ่งจะช่วยให้คุณสามารถจัดกลุ่มข้อ จำกัด เข้าด้วยกันและแก้ไขทั้งหมดได้ในครั้งเดียว


วิธีนี้ใช้งานได้ดี แต่ฉันพบว่าการใช้เพียงคอลเลกชันเต้าเสียบธรรมดาเพื่อจัดกลุ่มข้อ จำกัด นั้นง่ายกว่า ตัวอย่างเช่นในมุมมองที่ฉันกำลังทำงานมีข้อ จำกัด 47 ข้อ แต่มีเพียง 6 ข้อเท่านั้นที่ฉันต้องการเปลี่ยนที่รันไทม์ดังนั้นจึงเป็นลูปที่เล็กกว่ามาก นอกจากนี้ยังไม่จำเป็นต้องมีการซิงค์สตริงระหว่างสถานที่สองแห่ง
Gary Z

1
ขอบคุณ George สำหรับเคล็ดลับนี้ มันเป็นความช่วยเหลือที่แท้จริงสำหรับเค้าโครงปัจจุบันที่ฉันกำลังเล่นอยู่
Jim Hillhouse

1
สวยงาม
William Yang

สวัสดีฉันใช้วิธีเดียวกันนี้ แต่ไม่เคยเกิดขึ้นในกรณี if และฉันได้ระบุตัวระบุเดียวกัน
Rob13

ฉันสงสัยว่าเป็นไปได้ไหมที่จะตั้งชื่อข้อ จำกัด ตอบโจทย์มาก!
ShadeToD

38

เปลี่ยนHeightConstraintและโดยไม่ต้องสร้างWidthConstraintIBOutlet

หมายเหตุ:กำหนดข้อ จำกัด ด้านความสูงหรือความกว้างในไฟล์ 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 

2
มีวิธีการที่first(where: ...)คุณสามารถใช้ได้ทันทีแทนfilter+first
Vyachaslav Gerchicov

13

ลากข้อ จำกัด ไปยัง 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()
    }
}

9

คุณสามารถอัปเดตข้อ จำกัด ของคุณด้วยภาพเคลื่อนไหวที่ราบรื่นได้หากต้องการดูส่วนของโค้ดด้านล่าง:

heightOrWidthConstraint.constant = 100
UIView.animate(withDuration: animateTime, animations:{
self.view.layoutIfNeeded()
})

4

หากวิธีการข้างต้นไม่ได้ผลโปรดตรวจสอบให้แน่ใจว่าคุณได้อัปเดตในบล็อก Dispatch.main.async {} คุณไม่จำเป็นต้องเรียกใช้เมธอด layoutIfNeeded () แล้ว


4

ขั้นแรกให้เชื่อมต่อข้อ จำกัด ความสูงเข้ากับตัวควบคุมมุมมองของเราเพื่อสร้าง 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

}

1

ในการอัปเดตข้อ จำกัด ของโครงร่างคุณจะต้องอัพเดตคุณสมบัติคงที่และเรียกใช้ layoutIfNeeded after

myConstraint.constant = newValue
myView.layoutIfNeeded()

1
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()
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.