UIMotionEffect 同时在 UICollectionViewCell 中不起作用

Posted

技术标签:

【中文标题】UIMotionEffect 同时在 UICollectionViewCell 中不起作用【英文标题】:UIMotionEffect same time not work in UICollectionViewCell 【发布时间】:2014-02-26 10:20:21 【问题描述】:

我在单元格子视图上添加运动效果。 第一次它工作得很好。 但是当细胞重复使用时。运动效果不起作用....

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
testcell *processingCell = (testcell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
    UIInterpolatingMotionEffect *horizontalMotionEffect = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
    horizontalMotionEffect.minimumRelativeValue = @(-kMotionEffectRelativeValue );
    horizontalMotionEffect.maximumRelativeValue = @(kMotionEffectRelativeValue );
    UIInterpolatingMotionEffect *verticalMotionEffect = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y" type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis];
    verticalMotionEffect.minimumRelativeValue = @(-kMotionEffectRelativeValue );
    verticalMotionEffect.maximumRelativeValue = @(kMotionEffectRelativeValue );
    group = [[UIMotionEffectGroup alloc] init];
    group.motionEffects = @[horizontalMotionEffect,verticalMotionEffect];

);

if (!processingCell.coustomView) 
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    view.center = processingCell.contentView.center;
    view.backgroundColor =[UIColor blackColor];
    [processingCell addSubview:view];
    processingCell.coustomView = view;

processingCell.coustomView.hidden = YES;
processingCell.coustomView.hidden = NO;
[processingCell.coustomView addMotionEffect:group];
return processingCell;

如果我想隐藏这个子视图。并在展示之后。那么运动效果就没用了

processingCell.coustomView.hidden = YES;
processingCell.coustomView.hidden = NO;

我尝试使用这个调试运动效果。子视图被暂停

po [UIView _motionEffectEngine]

https://github.com/sipdar/parallax-effect-Bug

【问题讨论】:

您应该提供更多信息,例如您尝试了什么,错误是什么,日志,... 对于它的价值,我正在做一些非常相似的事情,但也发现它不起作用。您的代码没有防止将相同的运动效果多次添加到单元格中(当重新使用单元格时),您应该这样做。我正在这样做,但我仍然遇到同样的问题。 【参考方案1】:

我能够通过子类化 UICollectionViewCell 并在布局期间删除并重新应用运动效果来实现这一点。示例:

- (void) layoutSubviews
    [super layoutSubviews];
    [self addMotionEffectToView:self.contentView];


- (void) addMotionEffectToView:(UIView*) view

    for (UIMotionEffect* effect in [view.motionEffects copy])
        [view removeMotionEffect:effect];
    
    ... add your motion effect

【讨论】:

好提示。并且不要忘记在重新进入屏幕时重新加载可见单元格。

以上是关于UIMotionEffect 同时在 UICollectionViewCell 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIMotionEffect 类在 IOS 6 中启动应用程序时崩溃

如何在协议扩展中设置委托

延迟加载 UICollectionViewCell 的自定义子视图

从 UIImageView 中删除对象

如何在collectionView中重新加载补充视图

识别 CollectionView 中的单元格