Bir görünüm kaldırıldığında kısıtlamalara ne olur?


109

Sahip olduğum soru basit ama belgelerde herhangi bir bilgi bulamadım.

Görünüm hiyerarşisinden bir görünüm kaldırıldığında (veya başka bir görünüme taşındığında) düzen kısıtlamalarına ne olur?

Örneğin, alt Cgörünümleri Ave B. Konteyner Cbazı kısıtlamalara sahiptir. Sonra ararız [A removeFromSuperview]. Kısıtlamalara ne olur A?

Biz eklerseniz O zaman ne olacak Akadar Ctekrar?

Yanıtlar:


118

Kısıtlamalar kaldırıldı. Tekrar A eklerseniz, bunun için yeni kısıtlamalar yapmanız gerekecek veya kısıtlamaları A'yı kaldırmadan önce kaydederseniz, bunları geri ekleyebilirsiniz. Böyle bir şey yaptığımda, bunun gibi kısıtlamaları view1 adlı bir görünüm için kaydederim:

self.portraitConstraints = [NSMutableArray new];
for (NSLayoutConstraint *con in self.view.constraints) {
    if (con.firstItem == self.view1 || con.secondItem == self.view1) {
       [self.portraitConstraints addObject:con];
    }
}

7
Bu gerçek, belgelerin bir yerinde bulunabilir mi? Sana inanıyorum ama gerçeğin hiçbir yerde belirtilmemesi garip görünüyor.
Sulthan

2
Gerçekte görüşle birlikte kısıtlamaların da ortadan kalktığı sağduyu. Öyle olmasaydı, yerleşim sistemi bunları gelecekteki bir geçişte nasıl değerlendirebilirdi?
Mike Pollard

6
Bu cevap ne kadar açık görünse de, yine de çok yardımcı oldu!
race_carr

1
@pnollet, o sorudaki afişin yaptığını neden yaptığını bilmiyorum. Bunu doğrulamak için günlüğe kaydettim ve bir alt görünümü kaldırdığımda ve süpervizördeki kısıtlamaları kontrol ettiğimde, kaldırılan alt görünümle ilgili kısıtlamalar ortadan kalktı.
rdelmar

4
@Firo, kaldırılmaları gerektiğine eminim, bu yüzden iOS 6'da değillerse, muhtemelen bir hata. RemoveFromSuperview yönteminin dokümanı BTW, "Bu yöntemin çağrılması, kaldırmakta olduğunuz görünüme veya kaldırmakta olduğunuz görünümün alt ağacındaki herhangi bir görünüme başvuran tüm kısıtlamaları kaldırır" diyor.
rdelmar

41

Ben de bu soruyu sorduğum için, Apple Dokümanlarını sadece tekmeler için kontrol ettim ve kısıtlamaların kaldırıldığı belgelendi.

UIView removeFromSuperview yöntemine ilişkin belgeler şunları belirtir:

Bu yöntemin çağrılması, kaldırmakta olduğunuz görünüme veya kaldırmakta olduğunuz görünümün alt ağacındaki herhangi bir görünüme başvuran tüm kısıtlamaları kaldırır.

Bunun geçen yıl asıl soru yayınlandığında belgelenmiş olup olmadığından emin değilim, ancak birinin ihtiyaç duyması durumunda bu bilgiyi paylaşacağımı düşündüm ...


Bunu doğrudan
belgeden

3

Yine de, iki bağımsız ebeveyn görünümünüz A ve B'ye ve C'nin şu anda A'nın bir alt görünümü olduğu bir C alt görünümüne sahipseniz, [B addSubview: C] 'yi çağırmanın A ile ilgili herhangi bir kısıtlamayı TEMİZLEMEYECEĞİNİ unutmayın. ve C ve otomatik düzen, istisnalar atmaya başlayacaktır çünkü bu kısıtlamalar artık aynı hiyerarşideki görünümlerle ilgili değildir.

C'yi B'ye eklemeden önce kısıtlamaları kaldırmak için [C removeFromSuperview] 'u açıkça çağırmanız gerekecektir.

Bu, Mac OS X'te geçerlidir - iOS'u kontrol etmedim


İlginç! Bu bilgiyi nereden aldın? AddSubview için dokümanlar bu davranıştan bahsetmez. Soruyorum çünkü şu anda bir görünüm denetleyicisini kaldırırken 'Görünümde kısıtlama yüklenemiyor' şeklinde bir istisnam var - yapmadığım bir şey.
JimmyB

2

Kısıtlamalar da kaldırılır. [A removeFromSuperview]

Unutulurlar ve A'dan C'ye tekrar eklemek hiçbir kısıtlama getirmez.


0

Onlar da kaldırılır, basit bir test yapabilirsiniz. Bir SUBVIEW görünümü seçin ve SUBVIEW'i gözetimdeki yeniden boyutlandırmayı takip etmeye zorlayan maliyetler oluşturun (gözetleme kenarlarına eklenmiş gibi). Bunu yapmak için SUBVIEW'ı bu CONTAINERVIEW'e bir alt görünüm olarak eklersiniz ve aşağıdaki gibi kısıtlamalar olarak eklersiniz:
V: | - [SUBVIEW] - |
H: | - [SUBVIEW] - |
Bu kısıtlamalar SUBVIEW denetimine, dolayısıyla CONTAINERVIEW'e eklenmelidir.
SUBVIEW'ı tüm CONTAINERVIEW kısıtlamalarını kontrol ederek kaldırırsanız, ikisinin artık ortalıkta olmadığını görebilirsiniz.


0

Bu soru aynı zamanda arayüz oluşturucu tarafından da kanıtlanabilir. Sürükle bir damla ve zaman UIViewüzerinde ViewControllerdaha sonra kaldırmak eklenti kısıtlamaları UIView, mavi kısıtlamaları ortadan görebilirsiniz.


4
Storyboard, çalışma zamanı davranışının nasıl gerçekleşeceği hakkında hiçbir şey kanıtlamaz. Storyboard ne isterse yapabilir!
mxcl
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.