Bir UITableView hakkında oturan özelleştirilmiş bir başlığa ihtiyaç duyduğum bir durumda bu davranışı taklit etmeye çalışıyordum. Kendi "gezinti" çubuğumu aldım çünkü bu, sayfadaki diğer birçok şeyin altında yer alıyor ve bölüm başlıklarının varsayılan "yerleştirme" davranışını izlemesini istedim. Facebook / Instagram / Chrome / vb'de görülene benzer bir tarzda başka bir nesne ile birlikte bir UITableView / UIScrollView ayarlamanın oldukça zekice ve özlü bir yolunu bulduğumu düşünüyorum. Uygulamaların.
.Xib dosyamda, bileşenlerim serbest biçimli bir görünüme yükledim: http://imgur.com/0z9yebJ (üzgünüm, satır içi görüntülerin temsilcisi yok)
Sol kenar çubuğunda tablonun ana başlık görünümünün arkasında sıralandığına dikkat edin. Ekran görüntüsünden ayırt edemezsiniz, ancak aynı zamanda ana başlık görünümüyle aynı y konumuna sahiptir. Görüş alanı dışında genişlediğinden, UITableView üzerindeki contentInset özelliği 76 (ana başlık görünümünün yüksekliği) olarak ayarlandı.
Ana başlık görünümünün UIScrollView ile birlikte yukarı kaymasını sağlamak için, UIScrollViewDelegate'in scrollViewDidScroll yöntemlerini bazı hesaplamalar yapmak ve UIScrollView'un contentInset'ini ve ana başlık görünümünün çerçevesini değiştirmek için kullanıyorum.
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
UIEdgeInsets insets = scrollView.contentInset;
//tableViewInsetDelta and tableViewOriginalInsetValue are NSInteger variables that I set to 0 and 76, respectively, in viewDidLoad
tableViewInsetDelta = tableViewOriginalInsetValue + scrollView.contentOffset.y;
insets.top = tableViewOriginalInsetValue - tableViewInsetDelta;
if (scrollView.contentOffset.y > -76 && scrollView.contentOffset.y < 0) {
[scrollView setContentInset:insets];
self.pathTitleContainer.frame = CGRectMake(self.pathTitleContainer.frame.origin.x, 44 - tableViewInsetDelta, self.pathTitleContainer.frame.size.width, self.pathTitleContainer.frame.size.height);
} else if (scrollView.contentOffset.y > 0) {
insets.top = 0;
[scrollView setContentInset:insets];
self.pathTitleContainer.frame = CGRectMake(self.pathTitleContainer.frame.origin.x, -32, self.pathTitleContainer.frame.size.width, self.pathTitleContainer.frame.size.height);
} else if (scrollView.contentOffset.y < -76) {
insets.top = 76;
[scrollView setContentInset:insets];
self.pathTitleContainer.frame = CGRectMake(self.pathTitleContainer.frame.origin.x, 44, self.pathTitleContainer.frame.size.width, self.pathTitleContainer.frame.size.height);
}
}
İlk if ifadesi zor işin çoğunu yapar, ancak kullanıcının zorla sürüklediği ve scrollViewDidScroll'a gönderilen ilk contentOffset değerlerinin ilk if ifadesinin aralığının dışında olduğu durumları işlemek için diğer ikisini de dahil etmek zorunda kaldım .
Sonuçta, bu benim için gerçekten iyi çalışıyor. Projelerimi bir grup şişirilmiş alt sınıfla yüklemekten nefret ediyorum. Bunun performans açısından en iyi çözüm olup olmadığı konusunda konuşamıyorum (her zaman çağrıldığından beri scrollViewDidScroll'a herhangi bir kod koymakta tereddüt ettim), ancak kod ayak izi, gördüğüm en küçük çözüm. Bu sorun için bir çözüm ve bir UIScrollView'da bir UITableView yerleştirmeyi içermez (Apple, belgelerde buna karşı tavsiyede bulunur ve dokunma olayları UITableView'da biraz korkaktır). Umarım bu birine yardımcı olur!