gpt4 book ai didi

ios - UIView的addMotionEffect : loses it's effect when on UICollectionViewCell

转载 作者:行者123 更新时间:2023-11-29 10:36:56 28 4
gpt4 key购买 nike

您可以通过在物理设备上下载并运行此代码来重现错误:https://github.com/Hoya/RCCPeakableImageView

它所做的是通过 UIImageView 子类向图像添加视差效果。尝试克隆、构建项目,如果您倾斜/平移手机,图像将略微动画以创建视差效果。

UIImageView 的子类创建了一个内部的 UIImageView,其框架比自身略大,并通过 UIView 的 addMotionEffect 添加 UIInterpolatingMotionEffects:非常简单。

这在使用 UIScrollView 和 UITableView 时效果很好,但由于某些原因,当您滚动 UICollectionView 时,重复使用的 UICollectionViewCells 将失去运动效果。请注意,有趣的是,一旦您切换到 UIScrollView 或 UITableView 演示并切换回 UICollectionView 演示,运动效果将再次开始工作。

有解决办法吗?

RCCCollectionViewController

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
RCCAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
static NSString *identifier = @"Cell";
RCCPeakableCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier
forIndexPath:indexPath];
[cell.imageView setImage:appDelegate.images[indexPath.row]];
[cell.imageView setPadding:CGPointMake(20.f, 20.f)];

return cell;
}

RCCPeakableCollectionViewCell

@interface RCCPeakableCollectionViewCell : UICollectionViewCell
@property (nonatomic, weak) IBOutlet RCCPeakableImageView *imageView;
@end

最佳答案

你的代码有问题:

[cell.imageView setImage:appDelegate.images[indexPath.row]];
[cell.imageView setPadding:CGPointMake(20.f, 20.f)];

在这里,setImage: 将在 ImageView 上添加一些运动效果,然后 setPadding: 将再次添加这些效果。

我对 RCCPeakableImageView 类做了一些修改,将添加运动效果的代码移到了 layoutSubviews 上,它在重用的 UICollectionViewCell 上工作正常。以下是更新后的代码:

- (void)setImage:(UIImage *)image
{
// Store image
self.RCC_imageView.image = image;

[self setNeedsLayout];
}

- (void)setPadding:(CGPoint)padding
{
// Store padding value
_padding = padding;

[self setNeedsLayout];
}

- (void)layoutSubviews
{
[super layoutSubviews];

// Remove exising motion effects
for (UIMotionEffect *effect in [self.RCC_imageView motionEffects]) {
[self.RCC_imageView removeMotionEffect:effect];
}

// Add motion effects if there is any image.
UIImage *image = self.RCC_imageView.image;
if (image) {
// code that add motion effects
// ...
}
}

关于ios - UIView的addMotionEffect : loses it's effect when on UICollectionViewCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26399128/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com