2013-02-19 18 views
5

Szukam sposobu na implementację szumu, który jest odtwarzany za każdym razem, gdy komórka przechodzi przez określony punkt na ekranie (środek).Odtwarzaj dźwięk znacznika podczas przewijania UITableView (trochę jak UIPickerView)

Przelałem przez sieć, ale nie mogę się dowiedzieć, od czego zacząć? Każdy kierunek byłby świetny (nie szukając kogoś, kto by mi to rozwiązał, tylko trochę wglądu lub porady)

Dzięki!

UPDATE:

Oto kod mam realizowane przy użyciu metody, ale to nie działa prawidłowo. Wydaje się, że nigdy nie nazywa się "Tick" nslog, co oznacza, że ​​coś w parametrach jest nieprawidłowe. Moje komórki widoku tabeli mają 100 pikseli wysokości. Jakakolwiek rada?

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



} 

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    self.myTimer = [NSTimer scheduledTimerWithTimeInterval:1/30.0 target:self selector:@selector(checkTableViewScrollPosition) userInfo:nil repeats:YES]; 
} 


- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 
{ 
    if (self.myTimer) 
     [self.myTimer invalidate]; 
    self.myTimer = nil; 
} 


int currentContentOffset = 0; 
int tableviewCellHeight = 100; 
int thresholdValue = 50; 


- (void) checkTableViewScrollPosition { 


    int contentOffsetValue = _contentTableView.contentOffset.y; 

    NSLog(@"%d", contentOffsetValue); 


    if ((contentOffsetValue + tableviewCellHeight/2) % tableviewCellHeight <= thresholdValue && currentContentOffset != contentOffsetValue) { 
     NSLog(@"Tick!"); 
     NSLog(@"%d", contentOffsetValue); 


     currentContentOffset = _contentTableView.contentOffset.y; 

    } 


} 

Odpowiedz

6

start dodając obiekt do kontrolera widoku przechowywać ścieżkę indeksu komórki w środku tabela:

@property (nonatomic, strong) NSIndexPath *currentIndexPath; 

Następnie upewnij się, że twój kontroler obrazu jest przystosowany protokół UIScrollViewDelegate, a widok tableView jest dostępny za pośrednictwem właściwości self.tableview (lub zmień poniższy kod na odpowiednią właściwość tableView).

Następnie, wykonuje następującą metodę z UIScrollViewDelegate:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    // Find the indexPath of the cell at the center of the tableview 
    CGPoint tableViewCenter = self.tableview.center; 
    tableViewCenter = [self.tableview convertPoint:tableViewCenter fromView:self.tableview.superview]; 
    NSIndexPath *centerCellIndexPath = [self.tableview indexPathForRowAtPoint:tableViewCenter]; 

    // "Tick" if the cell at the center of the table has changed 
    if ([centerCellIndexPath compare:self.currentIndexPath] != NSOrderedSame) 
    { 
     NSLog(@"Tick"); 
     self.currentIndexPath = centerCellIndexPath; 
    } 
} 
+1

Absolutnie działa idealnie! Dziękuję bardzo! –

+0

Mam jeden problem, dźwięk kliknięcia jest odtwarzany, gdy aplikacja ładuje się po raz pierwszy lub w dowolnym momencie wracam do widoku zawierającego tabelę. Czy mimo to nie odtwarza się go po załadowaniu widoku? Z góry dziękuję za radę! –

+0

Nie przetestowałem tego, ale powinieneś być w stanie użyć tej samej techniki (bez Tick), aby ustawić self.currentIndexPath w viewWillAppear tak, aby zaczynał się od poprawnej wartości za pierwszym razem. – lnafziger

0

Można zacząć od sprawdzenia właściwości swojego Tableview contentOffset w metodzie scrollViewDidScroll: swojego delegata Tableview

1

protokół UITableViewDelegate zgodną UIScrollViewDelegate, więc jeśli przyjęcie tego protokołu można wdrożyć UIScrollViewDelegate- scrollViewWillBeginDragging i - scrollViewDidScroll wykryć przewijanie

1

Wdrożenie

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

metoda, która jest częścią protokołu UIScrollViewDelegate, z którym zgodny jest protokół UITableViewDelegate. W swojej implementacji sprawdź contentOffset scrollView, ilekroć zawartość przesuwa wysokość komórki (w górę lub w dół), odtwarzaj dźwięk.

0

Ustaw timer do uruchomienia z prędkością 30 klatek na sekundę, gdy metoda tableViewDelegate zwraca

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    self.myTickTimer = [NSTimer scheduledTimerWithTimeInterval:1/30.0 target:self selector:@selector(checkTableViewScrollPosition) userInfo:nil repeats:YES]; 
} 

tableViewDidBeginScroller a następnie zatrzymać stoper po osiągnięciu metodę delegata

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 
{ 
    if (myTickTimer) 
     [myTickTimer invalidate]; 
    self.myTickTimer = nil; 
} 

następnie uzyskać tableview .contentOffset i wydrukuj go, aby pokazać wszystkie przesunięcia treści podczas ich przewijania ...

- (void) checkTableViewScrollPosition 
{ 
    NSLog(@"tableview.contentOffset = %@", tableview.contentOffset); 
} 

Teraz masz offset treści wyrzucając odpowiednie liczby .... wykonaj moduł na contentOffset w oparciu o wysokość komórki tableview, a będziesz w stanie odtworzyć dźwięk, gdy tylko się zmieni .... odwołać przesunięcie treści pójdzie od 0 - tableViewCellHeight * numberOfCells + headerHeight + footerHeight ... tutaj jest zakończona metoda:

int currentContentOffset = 0; 
int tableviewCellHeight = 44; 
int thresholdValue = 5; 
void checkTableViewScrollPosition 
{ 
    NSLog(@"tableview.contentOffset = %@", tableview.contentOffset); 
    if ((tableview.contentOffset+tableviewCellHeight/2.0) % tableviewCellHeight <= threshHoldValue && 
     currentContentOffset != tableview.contentOffset) 
     NSLog(@"Tink"); 
     [[NSSound soundNamed:@"Tink"] play]; 

     currentContentOffset = tableview.contentOffset; 
} 
+0

Dostaję błąd tutaj: if ((_contentTableView.contentOffset + tableviewCellHeight/2,0)% tableviewCellHeight <= thresholdValue && currentContentOffset = _contentTableView.contentOffset!) Utrzymuje daje mi błąd mówiąc „nieprawidłowy argument do wyrażeń binarnych (CGPoint i podwójne) " –

0

Odtworzenie dźwięku w sposób UITableViewDelegate Tableview: willDisplayCell: forRowAtIndexPath :. Ta metoda jest wywoływana za każdym razem, gdy pojawi się nowa komórka.

Powiązane problemy