SubViewがディメンションを変更した場合、SubViewの再描画(drawRect)を強制するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1441760

質問

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
}

それは...完璧です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top