zoukankan      html  css  js  c++  java
  • UIView使用UIMotionEffect效果

    UIView使用UIMotionEffect效果

    这个效果在模拟器上看不了,所以无法截图.

    UIView+MotionEffect.h  +  UIView+MotionEffect.m

    //
    //  UIView+MotionEffect.h
    //
    //  Copyright (c) 2014年 Nick Jensen. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    @interface UIView (MotionEffect)
    
    @property (nonatomic, strong) UIMotionEffectGroup  *effectGroup;
    
    - (void)addXAxisWithValue:(CGFloat)xValue YAxisWithValue:(CGFloat)yValue;
    - (void)removeSelfMotionEffect;
    
    @end
    //
    //  UIView+MotionEffect.m
    //
    //  Copyright (c) 2014年 Nick Jensen. All rights reserved.
    //
    
    #import "UIView+MotionEffect.h"
    #import <objc/runtime.h>
    
    static char motionEffectFlag;
    
    @implementation UIView (MotionEffect)
    
    -(void)setEffectGroup:(UIMotionEffectGroup *)effectGroup
    {
        // 清除掉关联
        objc_setAssociatedObject(self, &motionEffectFlag,
                                 nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        
        // 建立关联
        objc_setAssociatedObject(self, &motionEffectFlag,
                                 effectGroup, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    -(UIMotionEffectGroup *)effectGroup
    {
        // 返回关联
        return objc_getAssociatedObject(self, &motionEffectFlag);
    }
    
    - (void)addXAxisWithValue:(CGFloat)xValue YAxisWithValue:(CGFloat)yValue
    {
        NSLog(@"%p", &motionEffectFlag);
        
        if ((xValue >= 0) && (yValue >= 0))
        {
            UIInterpolatingMotionEffect *xAxis = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
            xAxis.minimumRelativeValue = @(-xValue);
            xAxis.maximumRelativeValue = @(xValue);
            
            UIInterpolatingMotionEffect *yAxis = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y" type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis];
            yAxis.minimumRelativeValue = @(-yValue);
            yAxis.maximumRelativeValue = @(yValue);
            
            // 先移除效果再添加效果
            self.effectGroup.motionEffects = nil;
            [self removeMotionEffect:self.effectGroup];
            self.effectGroup.motionEffects = @[xAxis, yAxis];
            
            // 给view添加效果
            [self addMotionEffect:self.effectGroup];
        }
    }
    
    - (void)removeSelfMotionEffect
    {
        [self removeMotionEffect:self.effectGroup];
    }
    
    @end

    使用:

    - (void)viewDidLoad {
        
        [super viewDidLoad];
    
        UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"show"]];
        [self.view addSubview:imageView];
        imageView.center = self.view.center;
    
        imageView.effectGroup = [UIMotionEffectGroup new];
        [imageView addXAxisWithValue:5.f YAxisWithValue:5.f];
    }

    注意:

    给类目添加属性需要重写setter.getter方法哦:)

  • 相关阅读:
    经典面试题目C语言
    论C语言中二级指针和二维数组之间的区别
    判断单链表中是否有环找到环的入口节点
    论decltype和auto的区别
    在ubuntu下安装opencv
    C中有关引用和指针的异同
    (四)关于读文件的结束的判别方法(EOF和feof)以及区别
    (三)论sizeof与strlen之间的区别
    (二)C语言文本流和二进制流的区别
    (一)C的编译,printf,规范化
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3779970.html
Copyright © 2011-2022 走看看