Qanday UIView doimiy balandligi cheklovini dasturiy qilib yangilash kerak?

UIView bor va Xcode Interface Builder yordamida cheklovlarni o'rnatdim.

Endi UIView ning dasturining balandligi doimiy ravishda yangilanishi kerak.

myUIView.updateConstraints() ga o'xshash funksiya mavjud, lekin uni qanday ishlatishni bilmayman.

39
Chuqurlikdagi cheklovni chiqarib oling va dasturiy qilib belgilang
qo'shib qo'ydi muallif iMuzahid, manba
Ushbu havola yoki bu havolaga havolalar uchun.
qo'shib qo'ydi muallif Amna Farhan, manba

8 javoblar

Interfeysi yaratuvchisidan balandlikdagi cheklovni tanlang va uning chiqish qismini oling. Ya'ni, ko'rinish balandligini o'zgartirishni xohlasangiz, quyidagi kodni ishlatishingiz mumkin.

yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()

Boshqaruv updateConstraints() - bu UIView ga taqlid usuli. Cheklovlarni muntazam ravishda o'rnatishda foydalidir. Ko'rish uchun cheklovlarni yangilaydi. Batafsil ma'lumot uchun bu yerda bosing.

92
qo'shib qo'ydi
@ParthAdroja, iltimos, mening savolga bir ko'z tashlang. stackoverflow.com/questions/46034278/… ?
qo'shib qo'ydi muallif May Phyu, manba
O'zgarishlarni doimiy cheklashdan keyin tartibni o'zgartirish kerakligini eshitgan edim. nima uchun? va ba'zan i laynerIfNeeded ichiga viewWillLayoutSubviews va viewDidLayoutSubviews ichiga chaqiraman. yaxshi emasmi?
qo'shib qo'ydi muallif mnemonic23, manba
@newszer uchun boshqa mavzuga qarash kerak stackoverflow.com/questions/31651022/…
qo'shib qo'ydi muallif Parth Adroja, manba
Bugungi kunda cheklovlarni o'zim ishlab chiqarishga aylantirish mumkinligini o'rgandim va u yerdan men nima qilishni xohlasam qila olaman. Rahmat
qo'shib qo'ydi muallif Chris Mikkelsen, manba
Imkoniyatdagi ta'minotni yaratishimiz mumkinligini bilmasdim. Bu haqiqatan ham foydali. Rahmat
qo'shib qo'ydi muallif Regis St-Gelais, manba
Xib fayliga ega emasligim va sizning HyeightConstraint dasturini UIView dasturida qanday qilib o'rnatishingiz mumkin?
qo'shib qo'ydi muallif newszer, manba

Agar sizda bir nechta cheklovlar bilan qarash mavjud bo'lsa, bir nechta savdo nuqtalarini yaratmasdan ancha oson yo'l bo'lishi mumkin:

Interfeysi yaratuvchisida identifikatorni o'zgartirmoqchi bo'lgan har bir cheklovni bering:

enter image description here

So'ngra siz kodda quyidagi kabi cheklovlarni o'zgartirishingiz mumkin:

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

Siz bir necha identifikatorni cheklashingiz mumkin, bu esa sizni bir joyga to'plashni va bir vaqtning o'zida o'zgartirishni ta'minlaydi.

42
qo'shib qo'ydi
Bu yaxshi ishlaydi, lekin cheklovlarni guruhlarga ajratish uchun odatiy chiqish to'plamidan foydalanishni osonlashtiraman. Misol uchun, u erda ishlayotganim ko'rinishida 47 ta cheklov mavjud, ammo faqat oltitasi ishlash vaqtida o'zgarishni xohlaydi, shuning uchun u juda kichikroq pastadir. Bundan tashqari, ikki xil joylar orasida sinxronlashni saqlab qo'yish shart emas.
qo'shib qo'ydi muallif Gary Z, manba
buni bilmas edim! chiroyli! almashish uchun rahmat
qo'shib qo'ydi muallif Andres, manba
Ushbu maslahat uchun Jorjga rahmat. Bu men bilan o'ynayapman, hozirgi ba'zi tartiblar bilan haqiqiy yordamdir.
qo'shib qo'ydi muallif Jim Hillhouse, manba

Cheklovni VC-ga IBOutlet sifatida olib boring. Keyin uning bog'liq qiymatini o'zgartirishingiz mumkin (va boshqa xususiyatlar, hujjatlarni tekshiring):

@IBOutlet myConstraint : NSLayoutConstraint!
@IBOutlet myView : UIView!

func updateConstraints() {
   //You should handle UI updates on the main queue, whenever possible
    DispatchQueue.main.async {
        myConstraint.constant = 10
        myView.layoutIfNeeded()
    }
}
8
qo'shib qo'ydi

Buning uchun IBOutlet yaratishdan HeightConstraint va WidthConstraint ni o'zgartirish.

Note: Assign height or width constraint in storyboard or view after fetching this Constraint using this extension.

Bu kengaytmani balandlik va kenglik cheklovlarini olish uchun ishlatishingiz mumkin

var heightConstaint: NSLayoutConstraint? {
    get {
        return constraints.filter {
            if $0.firstAttribute == .height, $0.relation == .equal {
                return true
            }
            return false
            }.first
    }
    set{ setNeedsLayout() }
}

var widthConstaint: NSLayoutConstraint? {
    get {
        return constraints.filter {
            if $0.firstAttribute == .width, $0.relation == .equal {
                return true
            }
            return false
            }.first
    }
    set{ setNeedsLayout() }
}

Siz foydalanishingiz mumkin

yourView.heightConstaint = newValue 
3
qo'shib qo'ydi

Yuqoridagi usuli ishlamasa, uni Dispatch.main.async {} blokida yangilashingizga ishonch hosil qiling. Keyin layoutIfNeeded() uslubini chaqirishga hojat yo'q.

3
qo'shib qo'ydi
Bu ish, lekin nima uchun?
qo'shib qo'ydi muallif Malder, manba

Yuqorida ko'rsatilgan balandlikdagi cheklovni quyidagi ko'rinishdagi IBOutletni yaratishda bizning viewcontrollerga ulang

@IBOutlet weak var select_dateHeight: NSLayoutConstraint!

keyin quyidagi kodni qo'ying, yukni yuklaganmi yoki har qanday harakatlar ichida

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

agar u tugma bosilsa

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

}
3
qo'shib qo'ydi

Mizanpajni cheklashni yangilash uchun siz doimiy mulkni yangilashingiz va so'ngra nizomni tuzishingiz kerak.

myConstraint.constant = newValue
myView.layoutIfNeeded()
1
qo'shib qo'ydi
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()
}
0
qo'shib qo'ydi