Birkaç kısıtlamayla ekrana yerleştirilen bir UIView'ım var. Kısıtlamaların bazıları süpervizyona aittir, diğerleri diğer atalara aittir (örneğin bir UIViewController'ın view özelliği).
Tüm bu eski kısıtlamaları kaldırmak ve yeni kısıtlamaları kullanarak yeni bir yere yerleştirmek istiyorum.
Bunu, her bir kısıtlama için bir IBOutlet oluşturmadan ve hangi görünümün söz konusu kısıtlamaya sahip olduğunu hatırlamak zorunda kalmadan nasıl yapabilirim?
Ayrıntılı olarak açıklamak gerekirse, naif yaklaşım, kısıtlamaların her biri için bir grup IBOutlet oluşturmak ve ardından aşağıdaki gibi kodu çağırmak olacaktır:
[viewA removeConstraint:self.myViewsLeftConstraint];
[viewB removeConstraint:self.myViewsTopConstraint];
[viewB removeConstraint:self.myViewsBottomConstraint];
[self.view removeConstraint:self.myViewsRightConstraint];
Bu kodla ilgili sorun, en basit durumda bile 2 IBOutlet oluşturmam gerekmesidir. Karmaşık düzenler için bu, 4 veya 8 gerekli IBOutlet'e kolayca ulaşabilir. Ayrıca, kısıtlamayı kaldırmak için çağrımın uygun görünümde çağrıldığından emin olmam gerekir. Örneğin, bunun myViewsLeftConstraint
sahibi olduğunu hayal edinviewA
. Yanlışlıkla ararsam [self.view removeConstraint:self.myViewsLeftConstraint]
hiçbir şey olmaz.
Not: yöntemi constraintsAffectingLayoutForAxis umut verici görünüyor, ancak yalnızca hata ayıklama amaçlarına yöneliktir.
Güncelleme: Ben anlaşmak alıyorum cevaplar çoğu self.constraints
, self.superview.constraints
bunlardan veya bazı varyant. Bu yöntemler , görünümü etkileyen kısıtlamaları değil, yalnızca görünüme ait kısıtlamaları döndürdüğünden, bu çözümler işe yaramaz .
Sorunu bu çözümlerle açıklığa kavuşturmak için şu görünüm hiyerarşisini göz önünde bulundurun:
- Büyük baba
- Baba
- Ben mi
- Oğul
- Kız evlat
- Erkek kardeş
- Ben mi
- Amca dayı
- Baba
Şimdi aşağıdaki kısıtlamaları yarattığımızı ve bunları her zaman en yakın ortak atalarına bağladığımızı hayal edin:
- C0: Ben: Son ile aynı üstte (bana ait)
- C1: Me: genişlik = 100 (bana ait)
- C2: Ben: Brother ile aynı boyda (babaya ait)
- C3: Ben: Amca ile aynı (Büyükbabaya ait)
- C4: Ben: Büyükbaba ile aynı kaldı (Büyükbabaya ait)
- C5: Kardeş: Baba ile aynı kaldı (Babanın sahibi)
- C6: Amca: Büyükbaba ile aynı kaldı (Büyükbabaya ait)
- C7: Oğul: Kızımla aynı kaldı (bana ait)
Şimdi, etkileyen tüm kısıtlamaları kaldırmak istediğimizi hayal edin Me
. Herhangi bir uygun çözüm kaldırılmalı [C0,C1,C2,C3,C4]
ve başka hiçbir şey olmamalıdır .
Kullanırsam self.constraints
(benliğin Ben olduğu yerde), elde ederim [C0,C1,C7]
, çünkü bunlar Benim sahip olduğum tek kısıtlamalardır. Açıkçası, eksik olduğu için bunu kaldırmak yeterli olmayacaktır [C2,C3,C4]
. Üstelik C7
gereksiz yere kaldırıyor .
Kullanırsam self.superview.constraints
(benliğin Ben olduğu yerde), elde ederim [C2,C5]
, çünkü bunlar Babanın sahip olduğu kısıtlamalardır. Açıkçası C5
, tamamen ilgisiz olduğu için tüm bunları kaldıramayız Me
.
Kullanırsam grandfather.constraints
alırım [C3,C4,C6]
. Yine, tüm bunların C6
bozulmadan kalması gerektiğinden bunları kaldıramayız .
Ham kuvvet yaklaşımıdır (kendisi de dahil olmak üzere) görünümün atalarının her döngü gerçekleştirmek için ve görmesini firstItem
ya da secondItem
görünüşüdür kendisidir; eğer öyleyse, bu kısıtlamayı kaldırın. Bu, geri dönen doğru bir çözüme götürecektir.[C0,C1,C2,C3,C4]
ve yalnızca bu kısıtlamalara .
Bununla birlikte, atalar listesinin tamamında dolaşmaktan daha zarif bir çözüm olduğunu umuyorum.