SubViewがディメンションを変更した場合、SubViewの再描画(drawRect)を強制するにはどうすればよいですか?
-
10-07-2019 - |
質問
UIView
のサブクラスの行を含むUIViewがあります。サブクラスは drawRect
をオーバーライドし、 contentMode = UIViewContentModeRedraw
を設定しました。
ユーザーが親コンテナを押しつぶして伸縮すると、子ビュー
が押しつぶされて伸縮します。形状の変更が発生したため、 drawRect
を繰り返し呼び出して、子ビュー
の内容を変更したいと思います。これまでのところ、私は成功していません。これを行う正しい方法は何ですか?
乾杯、
ダグ
解決
Cocoaでは、drawRectを呼び出すことはめったにありません。更新する必要があるとリージョンまたはビューにマークするだけで、再描画がスケジュールされます。これにより、複数の無効化の再描画をまとめて折りたたむことができます。
Cocoa Touchの場合、 [set setNeedsDisplayを表示] 、または setNeedsDisplayinRect:(CGRect)
他のヒント
[view setNeedsLayout]を呼び出す必要があります。これにより、レイアウトが変更された場合、サブビューがdrawRect:呼び出しを受け取るようになります。ただし、これはテストしていません。
このソリューションは少しおかしいですが、論理的に意味があり、素晴らしい視覚的結果をもたらします。 NSLayoutManager
といくつかの NSTextContainer
を使用して、2列にテキストをレイアウトしています。複数のテキストコンテナを使用しているため(複数の UITextView
が必要かどうかわかりません)、
。 draw(rect:CGRect)
メソッドをオーバーライドしています> MyDrawingView:UIView
問題は、 self.contentMode = .redraw
を使用しても、ローテーションで多少のストレッチが発生することです。これは、契約を破るのに十分なほど重要です。
contentMode = .left
、または contentMode = .scaleAspectFit
の設定が、ピクセル単位の完全な回転という点で、私が望んでいたものに近いことに気付きました。しかし、明らかに、私は必要なドローコールを受け取っていませんでした。
そのため、私は layoutSubviews()
をオーバーライドし、 contentMode
を .scaleAspectFit
に切り替え、 super.layoutSubviews()
をクリックしてから、元に戻します。 :P
override func layoutSubviews() {
self.contentMode = .scaleAspectFit
super.layoutSubviews()
self.contentMode = .redraw
}
それは...完璧です。