UIView有一个transform的property。这个值的默认值为此view的bounds的center,当transform不为default value时,view的frame就为未定义属性,可以被忽略,从而可以任意改变view位置。
以下为测试代码。
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) UIView *testView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
CGRect rect = self.view.bounds;
_testView = [[UIView alloc] initWithFrame:
CGRectMake(20, 20, rect.size.width / 2.0 - 60, rect.size.height / 2.0 - 60)];
_testView.backgroundColor = [UIColor blueColor];
[self.view addSubview:_testView];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark button action
- (IBAction)moveRight:(id)sender
{
_testView.transform = CGAffineTransformTranslate(_testView.transform, 10.0f, 0.0f);
}
- (IBAction)moveOrigin:(id)sender
{
_testView.transform = CGAffineTransformIdentity;
}
- (IBAction)scale:(id)sender
{
_testView.transform = CGAffineTransformMakeScale(0.9, 0.9);
}
@end
- 蓝色背景的view是testView
- Move Right按钮。让view以当前transform为默认值,做右移。
- Move Origin按钮。让view回到初始位置。
- Scale按钮。让view以原始状态x、y均缩小至0.9。
- 无论在按下Move Origin前,按了多少次其他两个按钮,view都会回到初始位置(即定义view时的frame属性是的位置)。
- 按下Scale按钮。首次按下,蓝色背景view缩小至初始值0.9;以后再按,蓝色背景不会继续缩小,因为CGAffineTransformMakeScale以初始值做缩放。
- 按下Move Right按钮,每按一次,蓝色背景view就会右移10个单位;因为CGAffineTransformTranslate传入的第一个参数为基础,在此过程中,若按下Scale按钮,蓝色背景view会回到原处,并缩小。