UIView的transform属性及使用案例

transform属性作用:给我们的控件做一些形变,(平移,缩放,旋转)

移动
// 平移
//每次移动都是相对于上次位置
 _redView.transform = CGAffineTransformTranslate(_redView.transform, 100, 0);
//每次移动都是相对于最开始的位置
 _redView.transform = CGAffineTransformMakeTranslation(200, 0);
缩放
// sx:宽度缩放的比例 sy:高度缩放的比例
//每次缩放都是相对于最初的大小
_redView.transform = CGAffineTransformMakeScale(0.5, 0.5);
//每次缩放都是相对于上次的大小
_redView.transform = CGAffineTransformScale(_redView.transform, 0.5, 0.5);
旋转
// 每次旋转都是相对于最初的角度
_redView.transform = CGAffineTransformMakeRotation(M_PI_4);
//每次旋转都是相对于现在的角度
_redView.transform = CGAffineTransformRotate(_redView.transform, M_PI_4);

运用属性的一个实例

效果

效果

SB布局

这里写图片描述
输入密码的时候,手掌移动到眼睛

思路:

当编辑密码时,两个手指移动到眼部,并且缩小到无,两个胳膊(加载时先让两个胳膊分别移动到两个手中心位置)移动到眼部;
当退出编辑密码输入框时,手指还原,胳膊移动到手指中心

@property (nonatomic, weak) IBOutlet UIImageView *leftArm;

@property (nonatomic, weak) IBOutlet UIImageView *rightArm;

@property (nonatomic, weak) IBOutlet UIImageView *leftHand;

@property (nonatomic, weak) IBOutlet UIImageView *rightHand;

@property (nonatomic, weak) IBOutlet UIView *contentView;

@property (nonatomic, assign) CGFloat offsetLX;

@property (nonatomic, assign) CGFloat offsetLY;

@property (nonatomic, assign) CGFloat offsetRX;

@property (nonatomic, assign) CGFloat offsetRY;

@end

@implementation LoginAnimView

// 只要一个对象从xib加载就会调用这个方法
- (void)awakeFromNib
{
    // 左边手臂一开始平移的位置位置
    _offsetLX = -_leftArm.frame.origin.x;

    _offsetLY = self.bounds.size.height - _leftArm.frame.origin.y;

    // 右边手臂一开始平移的位置位置
    _offsetRX = _contentView.bounds.size.width - _rightHand.bounds.size.width - _rightArm.frame.origin.x;

    _offsetRY = _offsetLY;

    // 平移控件
    _leftArm.transform = CGAffineTransformMakeTranslation(_offsetLX, _offsetLY);

    _rightArm.transform = CGAffineTransformMakeTranslation(_offsetRX, _offsetRY);

}

- (void)startAnim:(BOOL)isCoverEye
{
    if (isCoverEye) {
        [UIView animateWithDuration:.25 animations:^{
            // 动画
            // 手臂
            _rightArm.transform = CGAffineTransformMakeTranslation(0, 0);
            _leftArm.transform = CGAffineTransformMakeTranslation(0, 0);
            // 手
            CGAffineTransform lTransform = CGAffineTransformMakeTranslation(-_offsetLX, -_offsetLY + 5);
            lTransform = CGAffineTransformScale(lTransform, 0.01, 0.01);
            _leftHand.transform = lTransform;


            CGAffineTransform rTransform =  CGAffineTransformMakeTranslation(-_offsetRX, -_offsetRY + 5);
            rTransform = CGAffineTransformScale(rTransform, 0.01, 0.01);

            _rightHand.transform = rTransform;

        }];

    }else{
        [UIView animateWithDuration:0.25 animations:^{

            // 手形变还原
            // CGAffineTransformIdentity:所有形变参数都是0
            _leftHand.transform = CGAffineTransformIdentity;
            _rightHand.transform = CGAffineTransformIdentity;

            // 手臂
            _leftArm.transform = CGAffineTransformMakeTranslation(_offsetLX, _offsetLY);

            _rightArm.transform = CGAffineTransformMakeTranslation(_offsetRX, _offsetRY);
        }];
    }

}
控制器中
@interface LoginViewController ()<UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet LoginAnimView *loginAnimView;
@property (weak, nonatomic) IBOutlet UITextField *pwdField;
@property (weak, nonatomic) IBOutlet UITextField *accountField;

@end

@implementation XMGLoginViewController


- (void)viewDidLoad {
    [super viewDidLoad];

    _pwdField.delegate = self;

}

#pragma mark -UITextFieldDelegate
// 一旦文本框开始编辑的时候就会通知代理调用这个方法
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [_loginAnimView startAnim:YES];
}

// 一旦文本框结束编辑的时候就会通知代理调用这个方法
- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [_loginAnimView startAnim:NO];
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值