我正在寻找一种方法来实现每次单元格通过屏幕上的特定点(中心)时播放的刻度噪声。
我一直在网上倾泻但是无法弄清楚从哪里开始?任何方向都会很棒(不是寻找有人为我解决,只是一些见解或建议)
谢谢!
更新:
以下是我使用您的方法实现的代码,但它无法正常工作。似乎永远不会调用“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;
}
}
答案 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:。每当新单元格即将进入视图时,都会调用此方法。