2011-01-03 45 views
6

Kullanıcı, tablonun sınırlarına kadar kaydırdığında beyaz boşluk göstermek yerine, döngüsel olarak yuvarlak bir şekilde kaydırmak yerine, döngüsel bir UITableView uygulamanın en iyi yolu nedir? Buradaki örnekler haftanın gününü, 24 saat içinde saati veya dünya çapında sıralı olarak sipariş edilen zaman dilimlerini seçmek olabilir. Bunu kesmek için birkaç fikriniz olsun (ortadan başlayarak 100x7 günlük bir liste olabilir) ama hiçbir şey zarif değil.Döngüsel UITableView Uygulaması

Bunun hakkında herhangi bir fikri veya deneyimi olan var mı?

David

cevap

-3

Döngüsel tablo yapamazsınız. numberOfRowsInSection yönteminden çok sayıda satır döndürdüğünüzü varsayalım (sonlu sayı) ve sonra bir üst uç ve tabelaya sahip olan tablonun satır sayısı için sonsuz sayıda döndüremediğini ve bu nedenle neden sona sahip olduğunu. bu yüzden yuvarlak masaya benzemiyor.

Sonlu bir sayı için de yapabilirsin, aynı zamanda satırları tekrarlayabilirsiniz, ancak bu döngüsel tablo yapmak mümkün değildir.

+0

Sanırım bu kadar. Burada yapılacak hiçbir şey zarif değil; En azından satırların hepsi sanal, böylece onları anında yapabilirsiniz. – drw

+0

@drw: Lütfen şu bağlantıyı takip edin: [link] (http://stackoverflow.com/questions/5675535/how-to-implement-cyclic-scrolling-on-tableview) –

+0

Aşağıdaki cevabıma bakın. Kodu var. Bu kodu uzun zamandır kullanıyorum. İşe yarıyor. –

4

Bu davranışı birkaç kez gördüm, ancak UITableView'de bu bir UIPickerView oldu. kod, ....

RollerViewController.h

@interface RollerViewController : UIViewController <UIPickerViewDelegate>{ 
    UIPickerView *picker; 
}  
@end 

RollerViewController.m

#import "RollerViewController.h" 

@implementation RollerViewController 

#define MAX_ROLL 100 
#define ROWS_COUNT 10 

#pragma mark - 
#pragma mark Helpers 

- (void) infinitePickerViewDidSelectRow:(NSInteger)row inComponent:(NSInteger)component{ 
    NSUInteger base10 = (MAX_ROLL/2) - (MAX_ROLL/2)%ROWS_COUNT; 
    [picker selectRow:row%ROWS_COUNT+base10 inComponent:component animated:FALSE]; 
} 

#pragma mark - 
#pragma mark UIPickerView dataSource delegate methods 

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView { 
    return 3; 
} 
- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component { 
    return MAX_ROLL; 
} 
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{ 
    return (CGFloat)40; 
} 
- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 
    [self infinitePickerViewDidSelectRow:row inComponent:component]; 
} 

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component{ 
    return (CGFloat) 50; 
} 
- (UIView *)pickerView:(UIPickerView *)thePickerView viewForRow:(NSInteger)row 
      forComponent:(NSInteger)component reusingView:(UIView *)rview { 

    UILabel *retval = (UILabel *)rview; 
    if (!retval) { 
     retval= [[[UILabel alloc] initWithFrame:CGRectMake(5,5,40,30) ] autorelease]; 
    } 

    retval.text = [NSString stringWithFormat:@"%d", row%ROWS_COUNT]; 
    retval.font = [UIFont systemFontOfSize:25]; 
    retval.textAlignment = UITextAlignmentCenter; 
    retval.backgroundColor = [UIColor clearColor]; 
    return retval; 
} 

#pragma mark overides 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, 320, 280)]; 
    picker.delegate = self; 
    [self.view addSubview:picker]; 

} 
- (void) viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 

    [self infinitePickerViewDidSelectRow:arc4random()%MAX_ROLL inComponent:0]; 
    [self infinitePickerViewDidSelectRow:arc4random()%MAX_ROLL inComponent:1]; 
    [self infinitePickerViewDidSelectRow:arc4random()%MAX_ROLL inComponent:2]; 
} 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
} 

- (void)dealloc { 
    [picker release]; 
    [super dealloc]; 
} 

@end 
2

Evet ciclic UIPickerView için kod oldukça basit ve bir UITableView muhtemelen dönüştürülebilir olduğunu bir döngüsel UITableView yapmak mümkündür. Satır sayısı olarak çok büyük bir sayıyı iletirsiniz ve sonra her bir satır için tablo görünümü isteklerini, satır_adı% number_of_rows iletirsiniz, böylece satır numarası gülünç derecede büyük olsa bile her zaman verilerinizde yinelenirsiniz.

Burada bir örnek görebilirsiniz

: UIPickerView bir UITableView ile uygulanan gibi http://dev.doukasd.com/2011/04/infinite-scrolling-dial-control-for-ios/

Temelde bu kadar.

4

UITableView, scrollViewDidScroll yönteminde UIScrollView ile aynıdır.

Sonsuz kaydırmayı öykünmesi kolay. çift ​​

  1. bu kafa ve kuyruk katına masa ve onlar eğilimindedir katına tablonun 2 bölümünün 1 kısmı arasında kullanıcı geçiş yapmak benim aşağıdaki kodu kullanabilirsiniz dairesel masayı

  2. taklit etmek üzere birleştirilen böylece dizisi tablonun başlangıcına veya sonuna ulaşmak için.

:

/* To emulate infinite scrolling... 

The table data was doubled to join the head and tail: (suppose table had 1,2,3,4) 
1 2 3 4|1 2 3 4 (actual data doubled) 
--------------- 
1 2 3 4 5 6 7 8 (visualising joined table in eight parts) 

When the user scrolls backwards to 1/8th of the joined table, user is actually at the 1/4th of actual data, so we scroll instantly (we take user) to the 5/8th of the joined table where the cells are exactly the same. 

Similarly, when user scrolls to 6/8th of the table, we will scroll back to 2/8th where the cells are same. (I'm using 6/8th when 7/8th sound more logical because 6/8th is good for small tables.) 

Thus, when user reaches 1/4th of the first half of table, we scroll to 1/4th of the second half, when he reaches 2/4th of the second half of table, we scroll to the 2/4 of first half. This is done simply by subtracting OR adding half the length of the new/joined table. 
*/ 


-(void)scrollViewDidScroll:(UIScrollView *)scrollView_ 
{ 

    CGFloat currentOffsetX = scrollView_.contentOffset.x; 
    CGFloat currentOffSetY = scrollView_.contentOffset.y; 
    CGFloat contentHeight = scrollView_.contentSize.height; 

    if (currentOffSetY < (contentHeight/8.0)) { 
    scrollView_.contentOffset = CGPointMake(currentOffsetX,(currentOffSetY + (contentHeight/2))); 
    } 
    if (currentOffSetY > ((contentHeight * 6)/ 8.0)) { 
     scrollView_.contentOffset = CGPointMake(currentOffsetX,(currentOffSetY - (contentHeight/2))); 
    } 

} 

Not; - Bu kodu NT Zaman Tablosu (Lite) adlı uygulamalarımdan birinde kullandım. Önizleme istiyorsanız, uygulamayı kontrol edebilirsiniz: https://itunes.apple.com/au/app/nt-time-table-lite/id528213278?mt=8

Tablonuz bazen çok kısa olabilir, yukarıdaki yöntemin başında veri sayısının söz konusu olduğu zaman yöntemden çıkmak için bir if mantığı ekleyebilirsiniz. örnek 9'dan küçüktür.

0

UIScrollView'e dayalı bir döngüsel tablo oluşturdum. Ve bu tabloya bağlı olarak, UIPickerView'i yeniden uygularım. Bu sınıf DLTableView ile ilgileniyor olabilirsiniz. https://github.com/danleechina/DLPickerView