7

Oluşturduğum bir mesajlaşma ekranım var ve neredeyse bitirdim. Görüntülerin çoğunu nib dosyaları ve kısıtlamaları ile oluşturdum. Ancak, küçük bir hatam var, ancak klavyenin, bir kısıtlama içeren bir animasyon bloğunda [self.view layoutIfNeeded] çağrısı gerekliliği nedeniyle reddettiği hücrelerin bazılarını görsel olarak görebiliyorum.Alt görünümler düzeninin ekranda görünmesine neden olan animasyon kısıtlamaları

- (void)keyboardWillHide:(NSNotification *)notification 
{ 
    NSNumber *duration = [[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey]; 
    NSNumber *curve = [[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey]; 

    [UIView animateWithDuration:duration.doubleValue delay:0 options:curve.integerValue animations:^{ 
     _chatInputViewBottomSpaceConstraint.constant = 0; 
     // adding this line causes the bug but is required for the animation. 
     [self.view layoutIfNeeded]; 
    } completion:0]; 
} 

bu da hücreler bazen ekranda görsel olarak düzeni yapar kendini hazırlamak benim toplama görüntülemeye neden beri görünümü gerekirse etrafında doğrudan düzeni çağıran herhangi bir yolu var mı: İşte sorundur.

Düşünebildiğim her şeyi denedim ancak hata düzeltmesine bir çözüm bulamıyorum. Zaten [cell setNeedLayout] aramayı denedim; Mümkün olan her yerde, hiçbir şey olmaz.

+0

Hücre kendini bıraktığında ne görüyorsun? UITableViewCell'inizde bir layoutSubviews geçersiz kıldınız mı? – dfmuir

+0

Hücrelerim iMessage'ın tam bir kopyası gibi görünüyor (sohbet balonları), klavyenin kapanmasından sonra ekrana gelen hücrelerde büyüyen sohbet balonunu görsel olarak görebilirim. Klavye kapatıldıktan sonra görünüm kaldırıldığında düzenli kaydırma yapılmaz .... Hayır Hücre için düzen alt görünümlerinde hiç kodum yok. – DBoyer

+0

Aslında bence baloncuğu büyütmek çok garip. – DBoyer

cevap

2

Bu nasıl? Gelen

senin UITableViewCell bu protokol @ özellik (nonatomic, zayıf) id layoutDelegate için temsilci oluşturun MYTableViewCellLayoutDelegate

@protocol MYTableViewCellLayoutDelegate <NSObject> 
@required 
- (BOOL)shouldLayoutTableViewCell:(MYTableViewCell *)cell; 

@end 

adlı özel protokolünü uygulayan;

Sonra UITableViewCell üzerinde layoutSubviews geçersiz: UITableViewCell düzenlendiği veya olmasın alır olmadığını kontrol etmek için geri arama:

- (void)layoutSubviews { 
    if([self.layoutDelegate shouldLayoutTableViewCell:self]) { 
     [super layoutSubviews]; 
    } 
} 

Şimdi, UIViewController sen shouldLayoutTableViewCell uygulayabilir.

-(void)shouldLayoutTableViewCell:(UITableViewCell *)cell { 
    return self.shouldLayoutCells; 
} 

, hücre düzenini devre dışı layoutIfNeeded arama ve tamamlama bloğunda hücre düzeni yeteneğini geri yüklemek için keyboardWillHide yöntemini değiştirin.

- (void)keyboardWillHide:(NSNotification *)notification { 
    NSNumber *duration = [[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey]; 
    NSNumber *curve = [[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey]; 

    self.shouldLayoutCells = NO; 
    [UIView animateWithDuration:duration.doubleValue delay:0 options:curve.integerValue animations:^{ 
     _chatInputViewBottomSpaceConstraint.constant = 0; 
     [self.view layoutIfNeeded]; 
    } completion:completion:^(BOOL finished) { 
     self.shouldLayoutCells = NO; 
    }]; 
} 

Örnek kod sağlamadığınız için bunu gerçekten test edemiyorum, ancak umarım bu size doğru yolu gösterir.

+0

Harika bir fikir Vay! Şimdi bunu test edeceğim. – DBoyer

+0

Serin. Eğer işe yararsa beni bilgilendir. – dfmuir

+0

Ne yazık ki hayır şans. :(Her şey tam olarak aynı şekilde olur – DBoyer

İlgili konular