Bir UIView sabit yükseklik kısıtlaması programlı olarak nasıl güncellenir?


103

Bir var UIViewve Xcode Interface Builder kullanarak kısıtlamaları ayarlıyorum.

Şimdi bu UIView'syükseklik sabitini programlı olarak güncellemem gerekiyor .

Gibi giden bir işlev var myUIView.updateConstraints()ama nasıl kullanacağımı bilmiyorum.


Yükseklik kısıtlamasından çıkın ve programlı olarak ayarlayın
iMuzahid

referanslar için bu bağlantıyı veya bu bağlantıyı kullanabilirsiniz .
Amna Farhan

İşte tek veya çoklu kısıtlamaları güncellemenin bir yolu. stackoverflow.com/a/54171693/8861442
Sarath Kumar Rajendran

Yanıtlar:


221

Arayüz oluşturucudan yükseklik kısıtlamasını seçin ve bir çıkış yapın. Bu nedenle, görünümün yüksekliğini değiştirmek istediğinizde aşağıdaki kodu kullanabilirsiniz.

yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()

Yöntem updateConstraints()bir örnek yöntemidir UIView. Kısıtlamaları programlı olarak belirlerken faydalıdır. Görünüm için kısıtlamaları günceller. Daha fazla ayrıntı için buraya tıklayın .


58
Bugün, Kısıtlamaların bir çıkışa dönüştürülebileceğini öğrendim ve oradan onunla yapmak istediğim her şeyi yapabilirim. Teşekkürler
Chris Mikkelsen

@ParthAdroja, kardeşim lütfen stackoverflow.com/questions/46034278/… soruma bir bakar mısın?
Mayıs Phyu

Bir xib dosyam yok ve bir UIView'de programlı olarak yourHeightConstraint'i nasıl ayarlayabilirim?
newszer


sabit kısıtlamayı değiştirdikten sonra layoutIfNeeded'ı çağırmamız gerektiğini duydum. neden? ve bazen viewWillLayoutSubviews ve viewDidLayoutSubviews içinde layoutIfNeeded çağırıyorum. tamam mı?
anımsatıcı23

104

Birden çok kısıtlamaya sahip bir görünümünüz varsa, birden çok çıkış oluşturmak zorunda kalmadan çok daha kolay bir yol şu olacaktır:

Arayüz oluşturucuda, bir tanımlayıcıyı değiştirmek istediğiniz her kısıtlamayı verin:

görüntü açıklamasını buraya girin

Ardından kodda birden çok kısıtlamayı şu şekilde değiştirebilirsiniz:

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

Birden fazla kısıtlamaya aynı tanımlayıcıyı verebilir, böylece kısıtlamaları bir arada gruplandırmanıza ve hepsini bir kerede değiştirmenize izin verebilirsiniz.


Bu iyi çalışıyor, ancak kısıtlamaları gruplamak için yalnızca normal bir satış koleksiyonunu kullanmayı daha kolay buluyorum. Örneğin, çalıştığım görünümde 47 kısıtlama var, ancak çalışma zamanında değiştirmek istediğim yalnızca 6'sı çok daha küçük bir döngüdür. Bu ayrıca dizelerin iki farklı yer arasında senkronize olmasını gerektirmez.
Gary Z

1
Bu ipucu için teşekkürler George. Oynadığım bazı güncel düzenler için gerçek bir yardım.
Jim Hillhouse

1
GÜZEL
William Yang

Merhaba, ben de aynı şekilde kullanıyorum ama hiçbir zaman if durumunda gitmiyor ve aynı tanımlayıcıyı verdim.
Rob13

Kısıtlamayı adlandırmanın mümkün olup olmadığını merak ediyordum. Mükemmel cevap!
ShadeToD

37

Değiştir HeightConstraintve WidthConstraintYaratmadan IBOutlet.

Not: Storyboard veya XIB dosyasında yükseklik veya genişlik sınırlaması atayın. Bu Kısıtlamayı bu uzantıyı kullanarak getirdikten sonra.

Bu uzantıyı, bir yükseklik ve genişlik Kısıtı almak için kullanabilirsiniz:

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

}

Kullanabilirsiniz:

yourView.heightConstraint?.constant = newValue 

2
+first(where: ...)filterfirst
Vyachaslav Gerchicov

13

Kısıtlamayı IBOutlet olarak VC'nize sürükleyin. Ardından ilişkili değerini (ve diğer özellikleri; belgeleri kontrol edin) değiştirebilirsiniz:

@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

İsterseniz kısıtlamanızı yumuşak bir animasyonla güncelleyebilirsiniz, aşağıdaki kod yığınına bakın:

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

4

Yukarıdaki yöntem işe yaramazsa, Dispatch.main.async {} bloğunda güncellediğinizden emin olun. Bu durumda layoutIfNeeded () yöntemini çağırmanıza gerek yoktur.


4

IBOutlet'i aşağıda gösterilen kod gibi oluşturmak için önce Yükseklik kısıtlamasını görüntü denetleyicimize bağlayın.

@IBOutlet weak var select_dateHeight: NSLayoutConstraint!

sonra aşağıdaki kodu görünüme koyun, yükledi veya herhangi bir eylemin içine

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

bir düğmenin içindeyse tıklayın

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

}

1

Bir düzen kısıtlamasını güncellemek için yalnızca sabit özelliğini güncellemeniz ve ardından layoutIfNeeded öğesini çağırmanız gerekir.

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()
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.