10yroの開発日記

株式会社10yro(トイロ)のエンジニアが書いています

【objective-c】特定のカスタムコントロールを回転時に再描画する方法

こんばんわ。 最近一段と寒いですね。先日も雪が積もってましたので子供に雪遊び誘ったら断られました;;


つい先日、iOSアプリを動作テストしている中でデバイスの回転時(縦と横)にカスタムコントロールのレイアウトが崩れる問題が発生しました。

※カスタムコントロールはdrawRectの中で画面サイズに応じて、frameサイズを決定するような形でが、画面が回転しても再描画されず中途半端なサイズになりました。


って事で画面回転時に再描画を促すような仕組みを作りましたので、備忘録として。

方法としては、回転時のイベントでself.view配下の全てのSubViewをチェックし、特定のクラスであれば再描画を促すって形ですね。

各画面のViewで継承しているベースViewがあれば、ベースに実装したら良いので楽ですね。

// 画面回転時に発生
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{
    [coordinator animateAlongsideTransition:^(id context) {
        // 回転前
    } completion:^(id context){
        // 回転後
          [self updateCustomControll:self.view.subviews];
    }];
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

// 再帰的にviewをチェックする。
-(void)updateCustomControl:(NSArray<__kindof UIView *> *) subviews{

    for (UIView* view in subviews) {
        if ([view isMemberOfClass:[CustomUITextField class]] ||
            [view isMemberOfClass:[CustomUIButton class]] ||
            [view isMemberOfClass:[CustomUIWebView class]]) {
          
            // 再描画を促す。
            [view setNeedsDisplay];
        }else{
            if(view.subviews.count >0){
                // 再帰的にsubviewsをチェックする
                [self updateCustomControll:view.subviews];
            }
        }
    }
}