Làm cách nào để cập nhật giới hạn chiều cao không đổi của UIView theo lập trình?


102

Tôi có UIViewvà tôi đặt các ràng buộc bằng Trình tạo giao diện Xcode.

Bây giờ tôi cần cập nhật UIView'shằng số chiều cao đó theo lập trình.

Có một chức năng giống như vậy myUIView.updateConstraints(), nhưng tôi không biết làm thế nào để sử dụng nó.


Đi ra của các hạn chế chiều cao và thiết programetically
iMuzahid

bạn có thể sử dụng liên kết này hoặc liên kết này để tham khảo.
Amna Farhan

Đây là một cách để cập nhật một hoặc nhiều ràng buộc. stackoverflow.com/a/54171693/8861442
Sarath Kumar Rajendran

Câu trả lời:


216

Chọn ràng buộc chiều cao từ Trình tạo giao diện và lấy một đầu ra của nó. Vì vậy, khi bạn muốn thay đổi chiều cao của chế độ xem, bạn có thể sử dụng đoạn mã dưới đây.

yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()

Phương thức updateConstraints()là một phương thức thể hiện của UIView. Nó rất hữu ích khi bạn thiết lập các ràng buộc theo chương trình. Nó cập nhật các ràng buộc cho khung nhìn. Để biết thêm chi tiết bấm vào đây .


58
Hôm nay tôi đã học được rằng Ràng buộc có thể được biến thành một lối thoát và từ đó tôi có thể làm bất cứ điều gì tôi muốn với nó. Cảm ơn
Chris Mikkelsen

@ParthAdroja, bạn có thể vui lòng xem câu hỏi của tôi stackoverflow.com/questions/46034278/… ?
May Phyu

Tôi không có tệp xib và làm cách nào để thiết lập yourHeightConstraint trong UIView theo lập trình?
newszer

@newszer, bạn cần xem chủ đề khác cho stackoverflow.com/questions/31651022/…
Parth Adroja

tôi nghe nói rằng chúng ta nên gọi layoutIfNeeded sau khi thay đổi ràng buộc hằng số. tại sao? và đôi khi tôi gọi layoutIfNeeded bên trong viewWillLayoutSubviews và viewDidLayoutSubviews. Như thế có ổn không?
mnemonic

104

Nếu bạn có một chế độ xem có nhiều ràng buộc, một cách dễ dàng hơn nhiều mà không cần phải tạo nhiều cửa hàng sẽ là:

Trong trình tạo giao diện, hãy đưa ra từng ràng buộc mà bạn muốn sửa đổi một số nhận dạng:

nhập mô tả hình ảnh ở đây

Sau đó, trong mã, bạn có thể sửa đổi nhiều ràng buộc như vậy:

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

Bạn có thể cung cấp nhiều ràng buộc cùng một mã định danh, do đó cho phép bạn nhóm các ràng buộc lại với nhau và sửa đổi tất cả cùng một lúc.


Điều này hoạt động tốt nhưng tôi thấy sẽ dễ dàng hơn khi chỉ sử dụng một bộ sưu tập cửa hàng thông thường để nhóm các ràng buộc. Ví dụ: trên khung nhìn mà tôi đang làm việc có 47 ràng buộc nhưng chỉ có 6 ràng buộc mà tôi muốn thay đổi trong thời gian chạy vì vậy đó là một vòng lặp nhỏ hơn nhiều. Điều này cũng không yêu cầu giữ các chuỗi đồng bộ giữa hai nơi khác nhau.
Gary Z

1
Cảm ơn bạn George về mẹo này. Đó là một trợ giúp thực sự với một số bố cục hiện tại mà tôi đang chơi.
Jim Hillhouse

1
ĐẸP
William Yang

Xin chào, tôi đang sử dụng nó theo cách tương tự, nhưng nó không bao giờ xảy ra trong trường hợp if và tôi đã đưa ra cùng một số nhận dạng.
Rob 13

Tôi đã tự hỏi liệu có thể đặt tên cho ràng buộc. Câu trả lời chính xác!
ShadeToD

35

Thay đổi HeightConstraintWidthConstraintKhông cần tạo IBOutlet.

Lưu ý: Gán giới hạn chiều cao hoặc chiều rộng trong Storyboard hoặc tệp XIB. sau khi tìm nạp Ràng buộc này bằng tiện ích mở rộng này.

Bạn có thể sử dụng tiện ích mở rộng này để tìm nạp Ràng buộc về chiều cao và chiều rộng:

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() }
}

}

Bạn có thể dùng:

yourView.heightConstraint?.constant = newValue 

2
Có một phương pháp first(where: ...)bạn có thể sử dụng ngay lập tức thay vì filter+first
Vyachaslav Gerchicov

13

Kéo ràng buộc vào VC của bạn dưới dạng IBOutlet. Sau đó, bạn có thể thay đổi giá trị liên quan của nó (và các thuộc tính khác; kiểm tra tài liệu):

@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

Bạn có thể cập nhật ràng buộc của mình bằng một hoạt ảnh mượt mà nếu muốn, hãy xem đoạn mã bên dưới:

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

4

Nếu phương pháp trên không hoạt động thì hãy đảm bảo bạn cập nhật nó trong khối Dispatch.main.async {}. Khi đó bạn không cần gọi phương thức layoutIfNeeded ().


4

Trước tiên, hãy kết nối ràng buộc Chiều cao với bộ điều khiển chế độ xem của chúng tôi để tạo IBOutlet như đoạn mã dưới đây được hiển thị

@IBOutlet weak var select_dateHeight: NSLayoutConstraint!

sau đó đặt mã bên dưới trong chế độ xem đã tải hoặc bên trong bất kỳ hành động nào

self.select_dateHeight.constant = 0 // we can change the height value

nếu nó nằm trong một nút bấm

@IBAction func Feedback_button(_ sender: Any) {
 self.select_dateHeight.constant = 0

}

1

Để cập nhật một ràng buộc bố cục, bạn chỉ cần cập nhật thuộc tính hằng số và gọi layoutIfNeeded sau.

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()
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.