我希望将 UISlider 用作“音频 VU Meter”类型指示器,其中音轨的级别不断更新 UISlider 的值。我的应用程序中的每个轨道当前都位于一个 UITableViewCell 中,VU Meter 是单元格内容视图中的一个子视图。一次显示多达 12 首曲目。
VU 表的更新是通过 TCP/IP 端口进行的,所以一旦我收到新的 VU 电平并设置推子值 ( mySlider.value = newValue
)。但是,我可以让滑块立即更新的唯一方法是调用performSelectorOnMainThread:@selector(reloadData) withObject:myTableView waitUntilDone:NO
. 似乎我不应该重新加载整个表的数据。
代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
TrackTableCell *cell = (TrackTableCell *)[tableView dequeueReusableCellWithIdentifier:@"TrackTableCell"];
if(cell == nil)
{
[[NSBundle mainBundle] loadNibNamed:@"TrackTableCell" owner:self options:nil];
cell = [self trackTableCell];
/**************************/
/********* FADER *********/
/**************************/
VolumeSlider *fader = [[VolumeSlider alloc] initWithFrame:CGRectMake(0, 0, 265, 30)];
[fader setRotatedThumbImage:[UIImage imageNamed:@"FaderCap.png"]];
[fader setRotatedMinTrackImage:[UIImage imageNamed:@"VolumeSlider.png"]];
[fader setRotatedMaxTrackImage:[UIImage imageNamed:@"VolumeSlider.png"]];
[fader addTarget:self action:@selector(volumeFaderSliderAction:) forControlEvents:UIControlEventValueChanged];
fader.value = 0;
// rotate the slider
fader.transform = CGAffineTransformMakeRotation(-M_PI_2);
[cell.contentView addSubview:fader];
fader.bounds = CGRectMake(0, 0, 265, 30);
fader.center = CGPointMake(70, 515);
// property of the cell
cell.volumeSlider = fader;
}
// set the slider to 0
cell.volumeSlider.value = [[self.tracks objectAtIndex:indexPath.row] volume];
return cell;
}
[[tracks objectAtIndex:trackNumber] volume]
通过数据模型 ( ) 已更新的通知调用以下方法。
- (void) updateVolumeFader:(NSNotification *)note
{
NSDictionary *extraInfo = [note userInfo];
int trackNumber = [[extraInfo objectForKey:@"trackNumber"] intValue];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:trackNumber inSection:0];
TrackTableCell *cell = (TrackTableCell *)[self.tracksTableView cellForRowAtIndexPath:indexPath];
cell.volumeSlider.value = [[tracks objectAtIndex:trackNumber] volume];
}
在查看代码时,我的猜测是我获取单元格指针的方式。我猜打电话cellForRowAtIndexPath
不是最好的方法。此外,我现在才意识到调用本身应该将推子更新为数组cellForRowAtIndexPath
中的新值。tracks
正如所建议的那样,最好保留我所有轨道滑块(或我所有单元格,就此而言)的缓存数组。虽然这肯定不是最有效的代码,但我仍然不明白为什么它不起作用?