一、 transform 属性
在OC中,通过 transform 属性可以修改对象的平移、缩放比例和旋转角度。
1)创建“基于控件初始位置”的形变
CGAffineTransformMakeRotation ——旋转
CGAffineTransformMakeTranslation ——平移
CGAffineTransformMakeScale ——缩放
2)创建“基于 transform 参数”的形变
CGAffineTransformTranslate
CGAffineTransformScale
CGAffineTransformRotate
补充:在OC中,所有跟角度相关的数值,都为弧度制 180度 = M_PI , 45度 = M_PI_4 。
正数表示顺时针旋转,负数表示逆时针旋转。
“基于 transform 参数”的形变可以基于控件上一次的状态进行叠加形变,如先旋转再平移。
代码:
- (void)rotate:(id)sender{
UIButton *button = (UIButton *)sender;
if (button.tag) {
//self.headImageView.transform = CGAffineTransformMakeRotation(-M_PI_4);
//逆时针旋转
self.headImageView.transform = CGAffineTransformRotate(self.headImageView.transform, -M_1_PI);
} else {
//顺时针旋转
self.headImageView.transform = CGAffineTransformRotate(self.headImageView.transform, M_PI_4);
}
}
ps: 注意一点,当你使用transform的时候 你旋转 或者变形后会发现和你想要的效果不一样了了 这个时候就应该用到 CGAffineTransformIdentity 这个属性。
例: 我在写一个播放器,横竖屏切换中 再次点击btn 回到最初始状态,这个时候就要使用这个属性 ,把控件恢复默认设置。 顺便提到一下 如果操控的控件的子控件 你用的是Masonry 进行约束 要用 mas_remake... 这个 。 啥也不说了 贴上代码自己感受。
-(void)layoutSubviews {
[super layoutSubviews];
if (!_isTransform) {
self.bottomImageV.transform = CGAffineTransformIdentity;
self.screenBtn.transform = CGAffineTransformIdentity;
self.numsPeopleImageV.transform = CGAffineTransformIdentity;
self.peopleL.transform = CGAffineTransformIdentity;
self.stopBtn.transform = CGAffineTransformIdentity;
self.bottomImageV.frame = CGRectMake(0, self.bounds.size.height - 35, self.bounds.size.width, 35);
[self.screenBtn mas_remakeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.bottomImageV);
make.right.equalTo(self.bottomImageV).offset(-15);
}];
[self.numsPeopleImageV mas_remakeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.bottomImageV);
make.left.equalTo(self.bottomImageV).offset(15);
make.height.with.equalTo(@(13));
}];
[self.peopleL mas_remakeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.bottomImageV);
make.left.equalTo(self.numsPeopleImageV.mas_right).offset(10);
}];
[self.stopBtn mas_remakeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self);
make.centerY.equalTo(self);
}];
}else {
self.bottomImageV.transform = CGAffineTransformRotate(self.bottomImageV.transform, M_PI_2);
self.bottomImageV.frame = CGRectMake(0, 0, 35, KScreenHeight);
self.screenBtn.transform = CGAffineTransformRotate(self.screenBtn.transform, M_PI_2);
self.numsPeopleImageV.transform = CGAffineTransformRotate(self.numsPeopleImageV.transform, M_PI_2);
self.peopleL.transform = CGAffineTransformRotate(self.peopleL.transform, M_PI_2);
self.stopBtn.transform = CGAffineTransformRotate(self.stopBtn.transform, M_PI_2);
[self.screenBtn mas_remakeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.bottomImageV);
make.bottom.equalTo(self.bottomImageV).offset(-15);
}];
[self.numsPeopleImageV mas_remakeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.bottomImageV);
make.top.equalTo(self.bottomImageV).offset(15);
make.height.with.equalTo(@(13));
}];
[self.peopleL mas_remakeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.bottomImageV);
make.top.equalTo(self.numsPeopleImageV.mas_bottom).offset(10);
}];
[self.stopBtn mas_remakeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self);
}];
}
}
对了,这里注意一点,如果改变控件的位置等 最好把布局子控件写在 layoutSubviews 这里面。
哈哈哈 写的不好请大神们指点了。
网友评论