我创建了UIView类的扩展,以便在整个项目中实现视差效果。我会建议你这样做,这样容易得多。
#pragma mark - Handling Effects
- (void)setMotion:(CGFloat)motion
{
if (motion == 0) {
for (UIMotionEffect *motionEffect in self.motionEffects) {
[self removeMotionEffect:motionEffect];
}
}
else {
UIInterpolatingMotionEffect *horizontalEffect = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
horizontalEffect.minimumRelativeValue = @(motion);
horizontalEffect.maximumRelativeValue = @(-motion);
UIInterpolatingMotionEffect *verticalEffect = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y" type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis];
verticalEffect.minimumRelativeValue = @(motion);
verticalEffect.maximumRelativeValue = @(-motion);
[self addMotionEffect:horizontalEffect];
[self addMotionEffect:verticalEffect];
}
}
- (CGFloat)motion
{
if (self.motionEffects.count == 0) {
return 0;
}
else {
UIInterpolatingMotionEffect *horizontalEffect = (UIInterpolatingMotionEffect *)[self.motionEffects objectAtIndex:0];
return [horizontalEffect.minimumRelativeValue floatValue];
}
}
示例:
view1.motion = 10;
view2.motion = 15;
view3.motion = 20;
问题是效果不太准确。是的,它看起来像是视差,但我没有强烈的感觉,我出现在3D风景中。视图向左滑动一点或向右滑动一点。
无论如何,我可以根据它的大小来计算UIView的视差运动(.motion)吗? 我猜测角度大小和观察点,但我不知道这些是如何测量的......
答案 0 :(得分:0)
此等式描述了物体相对于它们所处距离的大小:
angularSize = realSize / distance;
通过实现自己的初始化方法:
- (instancetype)initWithRealSize:(CGSize)realSize;
您可以通过调整视距来更改视图的大小。
运动值可按如下方式计算:
horizontalMotion = angularSize.width / 10.0;
verticalMotion = angularSize.height / 10.0;