[Objective-C] [iOS] AutoLayoutでViewをプログラムからサイズ変更する

Storyboard + AutoLayoutでアプリを作成していて、プログラム上からViewのサイズを変更したい時がありました。
サイズ変更といっても、内容を削除せずにViewのサイズを変更して、非表示 -> 表示と切り替えたい場合です。
簡単なテクニックで処理を実現する事ができたので、忘備録として記載します。また、前回の回転するボタンと組み合わせる事で、ボタンを押したら出たり消えたりするViewを作成する事ができます。

サンプルのイメージは下記のようなイメージです。

AutoLayoutのHeightのサイズを変更する

早速サンプルです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- (IBAction)pushButton:(id)sender {
    self.showLabel = !self.showLabel;
 
    [UIView animateWithDuration:0.3f animations:^(void){
        CGFloat viewHeight = 0.0f;
        if (self.showLabel) {
            [self.label sizeToFit];
            viewHeight = CGRectGetHeight(self.label.frame);
            self.toggleButton.transform = CGAffineTransformMakeRotation(M_PI - 0.0001);
        } else {
            self.toggleButton.transform = CGAffineTransformIdentity;
        }
 
        for (NSLayoutConstraint *constraint in self.label.constraints) {
            if (constraint.firstAttribute == NSLayoutAttributeHeight) {
                constraint.constant = viewHeight;
            }
        }
 
        [self.view setNeedsLayout];
    }];
}

ポイントはUILabelのNSLayoutConstraintのNSLayoutAttributeHeightの項目に対して
サイズを0.0fに設定してから、setNeedsLaoutでレイアウトを再計算させています。
これだけで、動的に出たり消えたりするViewを作成する事ができます。
しかも、AutoLaoutで他のViewの位置を再計算してくれるので、お手軽です。

少し前はこのようなViewを作成するのはちょっと面倒だった感じがしますが、いつのまにかこんなに簡単に実現できるようになっていました。

0 件のコメント :

コメントを投稿