Last active
April 14, 2019 18:08
-
-
Save maciekish/ecb670b9398d47bdf196 to your computer and use it in GitHub Desktop.
Easy UIInterpolatingMotionEffect. Learn more: http://hack.swic.name/easy-uiinterpolatingmotioneffect
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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) | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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 |
Good idea! I also added a Swift version.
Remove Effects-
func removeMotionEffects() {
let motionEffects = self.motionEffects as [UIMotionEffect]
for effect in motionEffects {
self.removeMotionEffect(effect)
}
}
- (void)removeMotionEffects {
NSArray *motionEffects = [NSArray arrayWithArray:self.motionEffects];
[motionEffects enumerateObjectsUsingBlock:^(UIMotionEffect *motionEffect, NSUInteger idx, BOOL *stop) {
[self removeMotionEffect:motionEffect];
}];
}
Should group the horizontal and vertical effects into a UIMotionEffectGroup for performance so they are evaluated at the same time.
Left-right and top-bottom are inverted. The image should move from right-to-left if in the background.
Typo: realtive
instead of relative
.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Why not just make this a category on UIView? That would reduce the API down to something like: