Bir tablonun çok sayıda satırı varsa, kullanıcı tabloyu yukarı/aşağı kaydırabilir. Bu, kaydırma hareketinin hızına/uzunluğuna bağlı olarak deterministik bir uzunluğa sahip gibi görünen bir kaydırma animasyonu yaratır. Başka kullanıcı etkileşimi olmadığında, kaydırma durduğunda tablonun hangi satırlarının görünür olacağını güvenilir bir şekilde hesaplamak mümkün mü?UITableView hangi satırda kaymayı durduracak?
cevap
iOS 5.0 ve sonraki sürümlerde scrollViewWillEndDragging:withVelocity:targetContentOffset: adı verilen UIScrollViewDelegate için yeni bir API bulunmaktadır. Bu yeni yöntemle, kaydırmanın durma pozisyonu, Video Session 100: What's New in Cocoa Touch'da açıklandığı gibi dokuzuncu dakika civarında hesaplanabilir ve hatta değiştirilebilir.
Kaç satırın görüntüleneceğini nasıl belirleyebileceğinizi bilmiyorum, ancak her zaman kaç tane HAVE gösterildiğini görebilirsiniz. (. Tablo başka dokunmadan w/durur kez) emin değil eğer yardımcı olur ama bu bunu
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// make sure to declare your integer in your .h file and to also synthesize
//say this is your int "howManyRowsAreShowing"
howManyRowsAreShowing = indexPath.Row;
//the rest of the code below is generic table view code for example only
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
// Set up the cell...
NSString *cellValue = [listOfItems objectAtIndex:indexPath.row];
cell.text = cellValue;
return cell;
}
İlginç soru yapacağını nasıl ..... UITableViewDelegate
yanı UIScrollViewDelegate
uygundur: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScrollViewDelegate_Protocol/Reference/UIScrollViewDelegate.html#//apple_ref/occ/intf/UIScrollViewDelegate
Kaydırmanın yavaşlatılmaya başladığını ve yavaşlamayı bitirdiğini öğrenmek için kullanabileceğiniz bazı delege geri çağrıları vardır.
Muhtemelen – scrollViewDidEndDecelerating:
'u kullanabilir ve bu noktada, tablonun hücre yüksekliklerini ve içerik ofset özelliğini kullanın (tablo alt sınıfları UIScrollView
) ve sonra yavaşlamadan sonra görünen hücreleri hesaplayın.
UITableView
UIScrollView
devralan ve UIScrollViewDelegate
yöntem ve Tablo görünümü indexPathsForVisibleRows
özelliğini kullanarak, kaydırma durur şu anda görülebilir olan hücre dizini yolları kontrol etmek için bu elde edebilirsiniz.
Başlangıç konumunu, yavaşlamanın başladığı yerden kaydedebilirsiniz, böylece kaydırma yönünün yukarı ya da aşağı olup olmadığını hesaplayabilirsiniz, daha sonra duracak olan hücre olup olmadığını size bildiren ilk ya da budur. görünür olanların son.
int startDeceleratingPosition;
-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
startDeceleratingPosition = scrollView.contentOffset.y;
}
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
BOOL isPositionUp = startDeceleratingPosition < scrollView.contentOffset.y;
NSArray *paths = [_myTableview indexPathsForVisibleRows];
UITableViewCell *cell;
if(isPositionUp){
cell = [_myTableview cellForRowAtIndexPath:[paths objectAtIndex:0]];
} else {
cell = [_myTableview cellForRowAtIndexPath:[paths lastObject]];
}
}
yukarıdaki kodu ile ilgili önemli bir not da bu sadece uygulama ayrıntıları olmasına rağmen, değişken _myTableview
yerine sadece UITableView *
için temsilci yöntemi değişkeni scrollView
döküm olarak tablo görünümüne işaret ve etkilememelidir gerektiğidir burada mantık.
Ah, sadece kaydırma hızını elde etmek için bir yöntem varsa ... –
Ama böyle bir yol var ... UIScrollView bir decelerationRate özelliğine sahiptir, bu sadece bunun için düşük seviye bir yaklaşım olur ve ayrıca bir Yanlış bir sonuç almak için daha fazla şans. http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScrollView_Class/Reference/UIScrollView.html#//apple_ref/doc/uid/TP40006922-CH3-DontLinkElementID_2 –
Yavaşlama oranı sadece bir sabittir yerçekimi gibi. Kaydırmanın ne zaman ve nerede duracağıyla ilgili daha fazla hesaplama yapmak için mevcut kaydırma hızını bilmeniz gerekir. Ayrıca, genel API aracılığıyla kaydırma hızını elde etmenin herhangi bir yolunu göremiyorum. –
İyi bir soru, ama anlatabildiğim kadarıyla ... bu, etrafta tutmak için karmaşık bir işlemin olacağı gibi görünüyor. –