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];
}