2014-11-20 25 views
5

Storyboard dosyasında tanımlı özel bir tablo görünümü hücrem var.Özel UITableViewCell için düzen tamamlandığında?

enter image description here

Bu hücre birkaç içerik sayfaları ve sayfa göstergeli kaydırma görünümünü içerir. Otomatik düzen kullanılarak tanımlanmış görünümler, içerik görünümü ve hücrenin kendisi. Sayfa1/2/3 görünümleri, kaydırma görünümü ile aynı genişliğe sahip olacak ve kapsayıcı görünümü, kaydırma görünümü olarak 3 kat genişliğe sahip olacak şekilde bağlanır. Bu şekilde, içeriğin, ekran boyutuna bakılmaksızın üç sayfalık bilgi gösterecek şekilde tam olarak boyutlandırıldığından emin değilim.

Kaydırma görünümü kaydırıldığında sayfa göstergesini güncelleştirmek için özel hücre sınıfında bir kod var - bu iyi çalışıyor.

Ben de dışarıdan sayfayı belirtmek için hücre sınıfında yöntemini açığa ve bu setter ben böyle bir şey yapıyorum: karşılaştığım sorun

- (void)setPage:(NSInteger)page animated:(BOOL)animated 
{ 
    CGFloat pageWidth = self.scrollView.frame.size.width; 
    self.pageControl.currentPage = page; 
    [self.scrollView setContentOffset:CGPointMake(page*pageWidth, 0) animated:animated]; 
} 

oldukça sık görünüm çerçevesini kaydırmak Bu ayarlayıcıyı çağırdığımda içerik boyutu doğru tanımlanmadı, bu nedenle sayfa göstergesi ayarlandı, ancak kaydırma görünümü içerik ofsetini değiştirmiyor.

Hücre otomatik düzenimin tamamlandığını ve setContentOffset'in çalışacağını garanti edebileceğimi bir an nerede yakalayabilirim? 'dan setPage'u aramayı denedim - açıkçası işe yaramadı, sonra willDisplayCell'dan aynı hikayeyi aramaya çalıştım - hücrenin kendisi zaten düzgün bir şekilde yerleştirilmiş, ancak kaydırma görünümü hala 600px (storyboard'dan) var ve başarısız oluyor.

+0

Bölümlenmiş içeriği mi görüntülemeye çalışıyorsunuz? –

+0

Evet. Bu tam olarak ne yapmaya çalıştığım – sha

cevap

1

Ismarlama bir uygulamada ayarlanmış görünüyorsunuz, işte ne işe yarayabilir.

Tablo görünümünden önce -setPage:animated: yönteminin çağrılması, alt görünümlerini ayarlama, hücreye aynı şeyi yapma şansı verme veya otomatik düzenleme tekerleği, hücredeki bazı durumları korumadığınız sürece çalışmaz (muhtemelen yalnızca sayfa sayı) aşağıdaki fırsatlardan birini veya birkaçını tepki:

  1. hücreyi almak için -cellForRowAtIndexPath: çağrı ardından UITableViewController yangınların -viewDidLayoutSubviews yöntemle ulaşılmasını beklemek ve. Hücrenin daha sonra geçerli bir karesi olmalıdır. Özelleştirilebilir UITableViewCell'inizde Bu zamana göre çerçeve de geçerli olmalıdır.

bu noktaların her iki sonra (görüntülenecek olan sayfa numarası içermelidir) ve uygun noktaya ilerleyin özel hücrenin durumunu incelemek olabilir. Yöntemi, hücreyi ayarlamak için (hücre üzerinde bir tamsayı özelliği) yeniden düzenleme ve -setPage:animated: gibi özel bir özel yönteme sahip olmanız ve yukarıdaki iki geçersiz kılma yönteminden birinin kaymayı hesaplamak ve kaydırma işlemini yapmak için çağırması mantıklı olacaktır.


de Önerilen alternatif:

Sen hücre en contentView bir UICollectionView gömerek bu işi başladı. UITableViewDataSource uygulamasını şu anda uygulayan UIViewController, UICollectionViewDataSource uygulamasını uygulayabilir ve koleksiyon görünümünü hücrelerine sağlayabilir.

UITableView hücrelerinizin ekranın genişliğinde ve yüksekliğinde olduğunu varsayarak, gömülü koleksiyon görünümünü temel olarak yatay olarak paginate olarak yapılandırabilirsiniz (UICollectionView UIScrollView öğesinin bir alt sınıfıdır).

kurma toplama görünümü düzeni nesnesi olarak UICollectionViewFlowLayout kullanabilir ve böylece o kadar yapılandırırken:

// Ensure the collection view scrolls horizontally. 
let flowLayout = UICollectionViewFlowLayout(); 
flowLayout.scrollDirection = .Horizontal; 

let collectionView = UICollectionView(frame:tableCellFrame, layout:flowLayout); 

// These are actually UIScrollView properties. 
collectionView.pagingEnabled = true; 
collectionView.bounces = false; 

Daha sonra özel bir UICollectionViewCell içeriğin her sayfasını yerleştirin ve toplama görünümü sizin için onları sayfalandırmak edecek . Bu, size ücretsiz bir paginated kaydırma API'si sağlamanın ek avantajına sahiptir.

+0

UIPageController'ı hücrenin içine koymanızı mı önerirsin? – sha

+0

Hayır, UITableView'u tamamen boşaltın. –

+0

Bu bir seçenek değil. Bu hücreyle ilgilenmem gerekiyor – sha

12

ben aşağıdakileri yaparak sona erdi: özel hücre alt sınıfında

[super layoutSubview] oldu sonra bile doğru çerçeveyi yoktu beni doğrudan contentView kaydırma görünümünde layoutSubview haber vermeden layoutSubview uygulanmasını

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    [self.contentView layoutSubviews]; 

    // set proper content offset 
    [self.scrollView setContentOffset:CGPointMake(self.frame.size.width*self.pageControl.currentPage, 0) animated:NO]; 
} 

eklendi tamamladı. Geçerli sayfa numarasını pageControl zaten tuttuğundan ve orijinal hücre bilgilerini yapılandırırken ayarlandığından, iç sayfa numarasını dahili değişkende saklamak zorunda kalmadım.

İlginç olan, orijinal olarak bu yöntemin içine [self.scrollView layoutSubview] ekledim ve iOS8'de iyi çalışıyordu, ancak iOS7'de iyi bir şey yapmadı. Hem 7 hem de 8'de çalıştığından emin olmak için bir seviye contentView'a gitmek zorunda kaldım.

İlgili konular