Easy UIInterpolatingMotionEffect. Learn more: http://hack.swic.name/easy-uiinterpolatingmotioneffect
// | |
// NaturalMotion.swift | |
// | |
// Created by Maciej Swic on 2014-06-06. | |
// Released under the MIT license. | |
// | |
import UIKit | |
extension UIView { | |
func addNaturalOnTopEffect(maximumRelativeValue : Float = 20.0) { | |
//Horizontal motion | |
var motionEffect = UIInterpolatingMotionEffect(keyPath: "center.x", type: .TiltAlongHorizontalAxis); | |
motionEffect.minimumRelativeValue = maximumRelativeValue; | |
motionEffect.maximumRelativeValue = -maximumRelativeValue; | |
addMotionEffect(motionEffect); | |
//Vertical motion | |
motionEffect = UIInterpolatingMotionEffect(keyPath: "center.y", type: .TiltAlongVerticalAxis); | |
motionEffect.minimumRelativeValue = maximumRelativeValue; | |
motionEffect.maximumRelativeValue = -maximumRelativeValue; | |
addMotionEffect(motionEffect); | |
} | |
func addNaturalBelowEffect(maximumRelativeValue : Float = 20.0) { | |
addNaturalOnTopEffect(maximumRelativeValue: -maximumRelativeValue) | |
} | |
} |
// | |
// UIView+NaturalMotion.h | |
// | |
// Created by Maciej Swic on 30/04/14. | |
// Released under the MIT license. | |
// | |
#import <UIKit/UIKit.h> | |
@interface UIView (NaturalMotion) | |
+ (void)addNaturalOnTopEffectWithMaximumRelativeValue:(CGFloat)maximumRealtiveValue; | |
+ (void)addNaturalBelowEffectWithMaximumRelativeValue:(CGFloat)maximumRealtiveValue; | |
@end |
// | |
// UIView+NaturalMotion.m | |
// | |
// Created by Maciej Swic on 30/04/14. | |
// Released under the MIT license. | |
// | |
#import "UIView+NaturalMotion.h" | |
@implementation UIView (NaturalMotion) | |
+ (void)addNaturalOnTopEffectWithMaximumRelativeValue:(CGFloat)maximumRealtiveValue { | |
UIInterpolatingMotionEffect* motionEffect = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis]; | |
motionEffect.minimumRelativeValue = @(maximumRealtiveValue); | |
motionEffect.maximumRelativeValue = @(-maximumRealtiveValue); | |
[self addMotionEffect:motionEffect]; | |
motionEffect = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y" type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis]; | |
motionEffect.minimumRelativeValue = @(maximumRealtiveValue); | |
motionEffect.maximumRelativeValue = @(-maximumRealtiveValue); | |
[self addMotionEffect:motionEffect]; | |
} | |
+ (void)addNaturalBelowEffectWithMaximumRelativeValue:(CGFloat)maximumRealtiveValue { | |
UIInterpolatingMotionEffect* motionEffect = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis]; | |
motionEffect.minimumRelativeValue = @(-maximumRealtiveValue); | |
motionEffect.maximumRelativeValue = @(maximumRealtiveValue); | |
[self addMotionEffect:motionEffect]; | |
motionEffect = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y" type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis]; | |
motionEffect.minimumRelativeValue = @(-maximumRealtiveValue); | |
motionEffect.maximumRelativeValue = @(maximumRealtiveValue); | |
[self addMotionEffect:motionEffect]; | |
} | |
@end |
This comment has been minimized.
This comment has been minimized.
Good idea! I also added a Swift version. |
This comment has been minimized.
This comment has been minimized.
Remove Effects-
|
This comment has been minimized.
This comment has been minimized.
Should group the horizontal and vertical effects into a UIMotionEffectGroup for performance so they are evaluated at the same time. |
This comment has been minimized.
This comment has been minimized.
Left-right and top-bottom are inverted. The image should move from right-to-left if in the background. |
This comment has been minimized.
This comment has been minimized.
Typo: |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
Why not just make this a category on UIView? That would reduce the API down to something like: