简单问题:
Apple Music的桌面视图只有在向下滚动超过某个阈值后才会显示右边缘的A-Z部分索引,并且该索引可以很好地进出动画。
我已经能够使用下面的代码触发出现/消失的行为,但索引只是弹出,没有动画,我找不到任何方法得到一个出现。
func sectionIndexTitlesForTableView(tableView: UITableView) -> [AnyObject]! {
if tableView.contentOffset.y > 88 {
return DataManager.sharedManager.frc!.sectionIndexTitles
} else {
return []
}
}
func scrollViewDidScroll(scrollView: UIScrollView) {
tableView.reloadSectionIndexTitles()
}
这基本上意味着每次滚动视图勾选时,它会重新加载区段索引,然后根据表的偏移量有条件地隐藏或显示索引。正如我所说,它有效,但它并没有为索引制作动画,如果可能,我真的很喜欢这个功能。
答案 0 :(得分:1)
似乎无法做到这一点,至少苹果公司没有提供任何API来动画部分索引视图。我可以滑入/滑出索引,但它不会调整单元格的大小。内容查看。
当您为截面索引视图设置动画时,在动画之后它会回到其初始位置。因此,当隐藏/可见时,我基本上将颜色设置为clearColor / black。
我不确定Apple是否批准此代码,因为它使用的是未记录的API
- (UIView *)indexTitlesView {
NSArray *subViews = [self.tableView subviews];
for (UIView *view in subViews) {
if ([NSStringFromClass([view class]) isEqualToString:@"UITableViewIndex"]) {
return view;
}
}
return nil;
}
- (void)slideIndexTitlesViewIn {
UIView *indexTitlesView = [self indexTitlesView];
CABasicAnimation *contentPositionAnimation = [CABasicAnimation animationWithKeyPath:@"position.x"];
contentPositionAnimation.fromValue = @(CGRectGetWidth(indexTitlesView.frame));
contentPositionAnimation.toValue = @(0);
contentPositionAnimation.additive = YES;
contentPositionAnimation.duration = 0.3;
contentPositionAnimation.delegate = self;
contentPositionAnimation.removedOnCompletion = NO;
contentPositionAnimation.fillMode = kCAFillModeForwards;
[indexTitlesView.layer removeAllAnimations];
[indexTitlesView.layer addAnimation:contentPositionAnimation forKey:@"slideInAnimation"];
self.tableView.sectionIndexColor = [UIColor blackColor];
}
- (void)slideIndexTitlesViewOut {
UIView *indexTitlesView = [self indexTitlesView];
CABasicAnimation *contentPositionAnimation = [CABasicAnimation animationWithKeyPath:@"position.x"];
contentPositionAnimation.fromValue = @(0);
contentPositionAnimation.toValue = @(CGRectGetWidth(indexTitlesView.frame));
contentPositionAnimation.additive = YES;
contentPositionAnimation.duration = 0.3;
contentPositionAnimation.delegate = self;
contentPositionAnimation.removedOnCompletion = NO;
contentPositionAnimation.fillMode = kCAFillModeForwards;
[indexTitlesView.layer removeAllAnimations];
[indexTitlesView.layer addAnimation:contentPositionAnimation forKey:@"slideOutAnimation"];
}
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
UIView *indexTitlesView = [self indexTitlesView];
NSArray *keys = [indexTitlesView.layer animationKeys];
for (NSString *key in keys) {
if ([indexTitlesView.layer animationForKey:key] == anim) {
if ([key isEqualToString:@"slideOutAnimation"] && flag == YES) {
self.tableView.sectionIndexColor = [UIColor clearColor];
}
[indexTitlesView.layer removeAllAnimations];
return;
}
}
}
答案 1 :(得分:0)
只需使用animateWithDuration()方法将alpha值设置为零,然后通过将值设置为1来为其设置动画
答案 2 :(得分:0)
我不建议使用私有类,因为它可以在未来的操作系统版本中轻松破解。 我已经为确切的目的实现了自定义控件。它模仿本机表索引外观,同时提供更多自定义功能。 查看https://github.com/mindz-eye/MYTableViewIndex了解详情。