iOS精品文章

iOS 关于 transform 属性

2017-11-06  本文已影响138人  范哥编程

一、 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 这里面。

哈哈哈 写的不好请大神们指点了。

上一篇 下一篇

猜你喜欢

热点阅读