2010-03-04 23 views
5

ile UIView subviews bakıyor:şuna benzer bir görünüm hiyerarşisi Verilen Boyut Kısıtlar

ContainerView 
    UIScrollView 
    ModuleView 
    ModuleView 
    ModuleView 
    ... 

ben ContainerView (vb listede, ızgara) keyfi bir biçimde dışarı ModuleViews lay istiyorum. Bunu yapmak için, ModuleViews aracılığıyla yineleyen -[ContainerView layoutSubviews]'u uygularım, her birinde -[ModuleView sizeToFit]'u arayın ve sonra bunları istediğiniz mizanpaja göre birbirlerine göre konumlandırın.

Sorum tekrarını en aza indirmek için ve doğru olarak düzenini korurken ModuleViews boyutunu değiştirmek için izin -[ModuleView sizeThatFits:] ve -[ModuleView layoutSubviews] uygulanmasının en iyi şekilde yapmaktır.

ModuleView'un bir çok satırlı UILabel alt görünümü ve her iki tarafındaki dolgu ile UIView olduğu en basit durumu kullanın. Gördüğünüz gibi

@implementation ModuleView 

- (CGSize)sizeThatFits:(CGSize)size { 
    CGFloat padding = 10.0f; 
    CGSize labelMaxSize = CGSizeMake(superview.size.width - (2 * padding), CGFLOAT_MAX); 
    CGSize labelSize = [self.label.text sizeWithFont:self.label.font constrainedToSize:labelMaxSize lineBreakMode:self.label.lineBreakMode]; 
    return CGSizeMake(superview.width, labelSize.height + (2 * padding)); 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    CGFloat padding = 10.0f; 
    CGSize labelMaxSize = CGSizeMake(self.size.width - (2 * padding), CGFLOAT_MAX); 
    CGSize labelSize = [self.label.text sizeWithFont:self.label.font constrainedToSize:labelMaxSize lineBreakMode:self.label.lineBreakMode]; 
    self.label.frame = CGRectMake(padding, padding, labelSize.width, labelSize.height); 

    CGRect frame = self.frame; 
    frame.size.height = self.label.frame.size.height + (2 * padding); 
    self.frame = frame; 
} 

@end 

, subviews büyüklüğü layoutSubviews yine sizeThatFits: kez hesaplanır ve: Bu gibi görünebilir. Bu çalışır, ancak görüşlerin daha karmaşık olduğu zaman hızla bir karmaşa haline gelir.

Bunu basitleştirmenin bir yolu var mı? Başkalarının bu probleme nasıl yaklaştığına dair iyi örnekler bulamadım.

+0

Merhaba Nathan, böyle bir durum için yeni bir çözüm var mı? – jchatard

cevap

1

Gerçekten karmaşık görünümler hiyerarşisi ile aynı tür bir sorunla karşılaştım. Sadece 'un görünüm görüntülemelerini içeren sarmalayıcılar gibi davranan bir UIView alt sınıfı oluşturarak sona erdim.

Hiyerarşinin tepesinden - (void) sizeToFit öğesini çağırmam gerektiğinden, bu boyutlandırma'u aşağıdan yukarıya doğru uygulamak için bir yönteme ihtiyacım var. Bunu (void) sizeToFit'i arayarak yaptım; süper görüşlerin - (CGSize) sizeThatFits: (CGSize) boyutundan doğrudan altyazılarda; yöntem.

Ve sonra bu yinelemeli olarak yapılır.

Kendime ve umarım başkalarına bir not yazdığım doğru sırayla bunu nasıl başaracağımı çok şaşırdım. Umarım bu size yardımcı olabilir: http://jchatard.com/understanding-uiview-layout-mecanism

İlgili konular