6

我以这种方式将 a 添加UIInterpolatingMotionEffect到 s 中的一些视图中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];

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

有什么我想念的吗?每次重复使用单元格时都应该应用效果吗?

4

3 回答 3

0

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

于 2013-12-16T05:43:16.733 回答
0

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

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

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

这完全为我解决了这个问题。

于 2014-08-12T18:04:41.047 回答
0

使用 a 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 上运行。

于 2015-10-02T15:23:06.117 回答