在UITableView滚动时播放滴答声(有点像UIPickerView)

时间:2013-02-19 21:10:25

标签: ios uitableview audio

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

我一直在网上倾泻但是无法弄清楚从哪里开始?任何方向都会很棒(不是寻找有人为我解决,只是一些见解或建议)

谢谢!

更新:

以下是我使用您的方法实现的代码,但它无法正常工作。似乎永远不会调用“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;

    }


}

6 个答案:

答案 0 :(得分:6)

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

@property (nonatomic, strong) NSIndexPath *currentIndexPath;

然后,确保视图控制器采用UIScrollViewDelegate协议,并且可以通过self.tableview属性访问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;
    }
}

答案 1 :(得分:1)

UITableViewDelegate协议符合UIScrollViewDelegate,因此,如果您采用此协议,则可以实施UIScrollViewDelegate - scrollViewWillBeginDragging- scrollViewDidScroll来检测滚动< / p>

答案 2 :(得分:1)

实施

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

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

答案 3 :(得分:0)

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

答案 4 :(得分: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);
}

现在你有内容偏移量,发出正确的数字....根据tableview单元格高度在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;
}

答案 5 :(得分:0)

在UITableViewDelegate方法tableView中播放声音:willDisplayCell:forRowAtIndexPath:。每当新单元格即将进入视图时,都会调用此方法。