当我尝试更改附加了motionGroup的UIImageView的帧时,我正在努力找到一种方法来消除偏移故障。
这是添加动作效果的代码:
UIInterpolatingMotionEffect *xAxis = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
xAxis.minimumRelativeValue = @(-25.0);
xAxis.maximumRelativeValue = @(25.0);
self.motionGroup = [[UIMotionEffectGroup alloc] init];
self.motionGroup.motionEffects = @[xAxis];
[self.backImageView addMotionEffect:self.motionGroup];
现在当我需要改变原点时:
[self.backImageView removeMotionEffect:self.motionGroup];
[UIView animateWithDuration:0.3 animations:^{
CGRect frame = self.backImageView.frame;
frame.origin.x = self.originalBackImageViewOffset.x + 40;
self.backImageView.frame = frame;
} completion:^(BOOL finished) {
self.originalBackImageViewOffset = self.backImageView.frame.origin;
[self.backImageView addMotionEffect:self.motionGroup];
}];
这样,如果设备倾斜,会有一点小故障。它出现在removeMotionEffect之后:因为imageView转换到它的原始状态,然后帧才会改变。如果手机没有倾斜,你甚至看不到毛刺(在模拟器中)。
如果你不删除animationGroup,那么在动画过程中倾斜手机会有更大的故障。
有谁知道如何克服这个问题?
P.S。我没有足够的声誉来创建标签“UIMotionEffectGroup”或“UIMotionEffect”。
答案 0 :(得分:0)
取代动画帧,应用变换,然后在动画完成时设置帧,而不删除动作效果:
[UIView animateWithDuration:0.3 animations:^{
self.backImageView.transform = CGAffineTransformMakeTranslation(40, 0);
} completion:^(BOOL finished) {
CGRect frame = self.backImageView.frame;
frame.origin.x = self.originalBackImageViewOffset.x + 40;
self.backImageView.frame = frame;
self.originalBackImageViewOffset = self.backImageView.frame.origin;
}];