2012-08-27 13 views
8

Görünümlerimden birinde sizeToFit numaralı telefonu aradığımda, iOS çerçevesinin bu görünümde önce sizeThatFits ve daha sonra layoutSubviews numarasını aradığını fark ettim. Bu benim için sorunlu çünkü benim sizeThatFits hesabımdaki hesaplama benim layoutSubviews'un sonuçlarına bağlıdır. Aşağıdaki örnekte, bir alt görünüm layoutSubviews'da ayarlanır ve bu alt görüntünün yüksekliği sizeThatFits'da kullanılır. Şu anda kodum çalışmıyor, sipariş tersine döndü. Benim bakış kontrolörün viewDidLoad yılındalayoutSubviews, sizeThatFits'den önce çağrılacak nasıl?

:

UIView* header = [[MyHeader alloc] init]; 
[header sizeToFit]; 
self.tableView.tableHeaderView = header; 
[header release]; 

Bence:

- (void) layoutSubviews { 
    [super layoutSubviews]; 
    [self.subView sizeToFit]; 
} 

- (CGSize) sizeThatFits:(CGSize)size { 
    return CGSizeMake(
     self.frame.size.width, 
     self.subView.frame.size.height 
    ); 
} 
+0

Bu sorunu daha önce çözdünüz mü? –

+0

İlk kodunuzda '[header sizeToFit]' işlevini görürsünüz ki bu hiçbir şey yapmaz 'MyHeader'ın' sizeThatFits: 'geçersiz kılmıyor: > Bu yöntemin varsayılan uygulaması, görünümün sınır dikdörtgeninin boyut bölümünü döndürür. – Rivera

cevap

0

sadece -layoutSubviews yöntemin yerine -sizeThatFits: yönteminde subview çerçevesini değiştirilemiyor?

1

layoutSubviews'u zorlamak için layoutIfNeeded numaralı telefonu aramayı denediniz mi? Yanıltıcı isme rağmen, bu hemen layoutSubviews tetikleme yolu. Bunu sizeToFit veya sizeThatFits'dan önce çağırmayı deneyin.

6

Görüşünüzün her zaman, hangi sırayla arama yaptığınıza bakılmaksızın, Right Thing'i (tm) yapmasını istersiniz. Bunu başarmak için, görünümünüze ve alt görünümlere istediğiniz yüksekliği hesaplayan kodunuzu ayrı bir yöntemle uygulamanızı öneririm. Bu doğrultuda bir şey:

- (void)updateSubviewDimensions 
{ 
    [self.subview sizeToFit]; 
    // possibly much more code 
} 

- (void) layoutSubviews { 
    [super layoutSubviews]; 
    [self updateSubviewDimensions]; 
} 

- (CGSize) sizeThatFits:(CGSize)size { 
    [self updateSubviewDimensions]; 
    return CGSizeMake(
     self.frame.size.width, 
     self.subView.frame.size.height 
    ); 
} 

Bu şekilde, sizeToFit çağırmadan önce belirli bir yöntemi çağırmak için hatırlayarak bağımlı değildir, ancak görünümünüzü her zaman istediğini yapacağız. Ayrıca, kodunuz daha az kırılgandır ve bundan birkaç ay sonra baktığınız zaman daha kolay anlaşılabilir (veya farklı bir geliştiriciye bakın).

+0

TL; DR: updateConstraints öğesini uygulayın ve "updateSubviewDimensions" öğesini çağırın. Verbose: Tam bir cevap için zamanım yok, ama bence uygun çözüm, updateConstraints uygulamasını uygulamaktır. IOS 8'deki testlerden.3, sistemLayoutConstraintsFittingSize'in varsayılan UIView uygulaması, sonuç olarak updateConstraints öğesine bir çağrı çağırır. Bu, AL sistemini, aslında bir şeyleri dışarıda bırakmak zorunda kalmadan, boyutu belirlemek için ihtiyaç duyduğu her şeyi verir. –

2

sizeThatFits: öğesinin düzeninin doğru olması gerekiyorsa, bir düzen zorlamanız gerekir (aşağıdaki kod bölümüne bakın.) Ancak bu, düzeninizin "boyut" değerini dikkate almadığı için kötü tasarlanmış olduğunu düşünüyorum.

- (CGSize) sizeThatFits:(CGSize)size { 

    [self setNeedsLayout]; 
    [self layoutIfNeeded]; 

    return CGSizeMake(
     self.frame.size.width, 
     self.subView.frame.size.height 
    ); 
} 

Daha iyi bir yaklaşım sizin bakış gerekli boyutunu belirlemek için, sonra subviews için otomatik düzenini kullanabilir systemLayoutSizeFittingSize: kullanmak olabilir (genel sizeThatFits:)

yapamazsın ya istemiyorsanız Otomatik düzeni kullanmak için, gerçek düzen ve düzen hesaplaması için ayrı kod yollarına sahip olmalısınız.

1

Burada sorun, alt görünümlerin layoutSubviews çağrıldıktan sonra boyutlarının olmamasıdır. Bu, özel bir tablo görünümü hücresindekiyle aynıdır.

Bu konuyla ilgilenmek için ya otomatik mantıklara dayanmadan açık bir boyut elde etmek için ya mantığı değiştirmek ya da matematiği kendiniz yapmanız gerekir.

İlgili konular