动画UITableView索引,Apple Music?

时间:2015-08-02 07:45:06

标签: ios uitableview

简单问题:

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()
}

这基本上意味着每次滚动视图勾选时,它会重新加载区段索引,然后根据表的偏移量有条件地隐藏或显示索引。正如我所说,它有效,但它并没有为索引制作动画,如果可能,我真的很喜欢这个功能。

3 个答案:

答案 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了解详情。