7

我正在寻找一种方法来实现每次单元格通过屏幕上的特定点(中心)时播放的滴答声。

我一直在网上倾诉,但不知道从哪里开始?任何方向都会很棒(不找人为我解决,只是一些见解或建议)

谢谢!

更新:

这是我使用您的方法实现的代码,但它不能正常工作。它似乎从未调用过“Tick”nslog,这意味着参数中的某些内容不正确。我的 tableview 单元格高 100 像素。有什么建议吗?

- (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;

    }


}
4

6 回答 6

6

首先向视图控制器添加一个属性,以存储表格中心单元格的索引路径:

@property (nonatomic, strong) NSIndexPath *currentIndexPath;

然后,确保您的视图控制器采用该UIScrollViewDelegate协议,并且您的 tableView 可以通过 self.tableview 属性访问(或将下面的代码更改为 tableView 的适当属性)。

然后,从 中实现以下方法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;
    }
}
于 2013-02-20T03:08:54.020 回答
1

UITableViewDelegate协议符合UIScrollViewDelegate,因此如果您采用此协议,您可以实现UIScrollViewDelegate - scrollViewWillBeginDragging- scrollViewDidScroll来检测滚动

于 2013-02-19T21:16:33.010 回答
1

实施

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

UITableViewDelegate 协议符合的 UIScrollViewDelegate 协议的一部分的方法。在您的实现contentOffset中检查滚动视图,每当内容偏移单元格的高度(向上或向下)时,播放您的声音。

于 2013-02-19T21:21:11.207 回答
0

您可以首先在tableView 委托contentOffset的方法中检查 TableView 的属性scrollViewDidScroll:

于 2013-02-19T21:13:46.337 回答
0

设置一个计时器以在 tableViewDelegate 方法返回后以每秒 30 帧的速度运行

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

tableViewDidBeginScroller,然后在到达委托方法后停止计时器

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

然后获取 tableview.contentOffset 并将其打印出来以向您显示所有内容偏移量,因为它在您滚动时会发生变化......

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

现在你有内容偏移量发出正确的数字....根据表格视图单元格高度对 contentOffset 进行模数,然后你将能够在它改变时播放声音....回想内容偏移量将从0 - tableViewCellHeight*numberOfCells + headerHeight + footerHeight... 这是完成的方法:

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;
}
于 2013-02-19T21:39:10.753 回答
0

在 UITableViewDelegate 方法 tableView:willDisplayCell:forRowAtIndexPath: 中播放声音。每次有新单元格即将出现时,都会调用此方法。

于 2014-06-17T02:39:18.567 回答