UIInterpolatingMotionEffect随机工作

时间:2013-10-11 13:43:39

标签: ios objective-c uitableview

我正在UIInterpolatingMotionEffect以这种方式向某些观看视频添加UITableViewCell

UIInterpolatingMotionEffect *horizontalEffect = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
UIInterpolatingMotionEffect *verticalEffect = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y" type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis];
horizontalEffect.minimumRelativeValue = @(-horizontal);
horizontalEffect.maximumRelativeValue = @(horizontal);
verticalEffect.minimumRelativeValue = @(-vertical);
verticalEffect.maximumRelativeValue = @(vertical);

UIMotionEffectGroup *effectsGroup = [UIMotionEffectGroup new];
effectsGroup.motionEffects = @[horizontalEffect, verticalEffect];

[view addMotionEffect:effectsGroup];

问题在于效果只是随机出现,有些视图会产生效果而有些视图不会产生效果。在推动视图控制器并返回之后,其他一些工作正常,而另一些则不工作。

有什么我想念的吗?是否应该在每次重复使用细胞时应用效果?

3 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。我通过强制重绘所有单元来修复它 - 使用reloadSections:withRowAnimation:可能适用于大多数人(或类似的方法),虽然对我来说我最终必须编写自己的单元格并重用代码让我保留一个引用可变数组中每个创建的单元格,然后在我选择时清除该数组并从头开始构建。希望有所帮助。

答案 1 :(得分:0)

更新: 不得不完全删除我以前的答案,因为我终于找到了更好的解决方案。

一旦重新绘制/出列单元格,看起来像iOS7 / 8会混淆表格/集合视图中的视图的动作效果。在单元格出列/设置后,您需要确保设置/更新运动效果。

要正确执行此操作,您需要将动作效果逻辑移动到-layoutSubviews方法。 然后只需在构造函数和方法中发送[self setNeedsLayout]消息,用于在单元格出列并更新后更新单元格内容。

这完全解决了我的问题。

答案 2 :(得分:0)

使用UICollectionView,我遇到了同样的问题。推送新控制器后,返回UICollectionView,我的一些单元格UIInterpolatingMotionEffect停止运行,但仍然列在视图的motionEffects属性中。

<强>解决方案: 我打电话给-layoutSubviews设置我的动作效果,每当配置单元格时,我都会调用-setNeedsLayout以确保调用-layoutSubviews

此外,每次我设置动作效果时,我都会删除之前的动作效果。这很关键。

以下是我在-layoutSubviews中调用的方法:

- (void)applyInterpolatingMotionEffectToView:(UIView *)view withParallaxLimit:(CGFloat)limit
{
    NSArray *effects = view.motionEffects;
    for (UIMotionEffect *motionEffect in effects)
    {
        [view removeMotionEffect:motionEffect];
    }

    UIInterpolatingMotionEffect *effectX = [[UIInterpolatingMotionEffect alloc] initWithKeyPath: @"center.x" type: UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
    effectX.minimumRelativeValue = @(-limit);
    effectX.maximumRelativeValue = @(limit);

    UIInterpolatingMotionEffect *effectY = [[UIInterpolatingMotionEffect alloc] initWithKeyPath: @"center.y" type: UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis];
    effectY.minimumRelativeValue = @(-limit);
    effectY.maximumRelativeValue = @(limit);

    [view addMotionEffect: effectX];
    [view addMotionEffect: effectY];
}

希望它有所帮助!此外,在iOS 9上运行。