2009-09-17 13 views
23

私はUIViewのサブクラスの行が含まれているのUIViewを持っています。サブクラスはdrawRect:をオーバーライドしており、contentMode = UIViewContentModeRedrawに設定されています。ユーザ南瓜としてディメンションを変更したときにサブビューを強制的に再描画(drawRect)する方法

親コンテナをchild viewsスカッシュとストレッチを伸ばします。形状の変化が発生すると、私はdrawRectを繰り返し呼び出してchild viewsの内容を変更したいと考えています。これまでのところ私は成功していません。これを行う正しい方法は何ですか?

乾杯、ココアで

ダグ

答えて

57

は、あなたはめったに(これまでの場合)のdrawRectを呼び出す - あなただけの更新を必要として、地域やビューをマークしていない、それが再描画のためにスケジュールされます。これにより、複数の無効化の再描画をまとめて行うことができます。ココアtouch用

、あなたはあなたが[ビューsetNeedsLayout]を呼び出す必要が[view setNeedsDisplay]、またはsetNeedsDisplayinRect:(CGRect)

+1

私はそれを正確にやってみました。無効。 Nuthin。サブクラスにおいて IがのsetTransformをオーバーライド:方法thusly: - (ボイド)のsetTransform:(CGAffineTransform)newValueに{ [スーパーのsetTransform:newValueに]。 [self setNeedsDisplay]; } – dugla

+0

はどうやら、私は今futzingコードのビットsetNeedsDisplayが正常に発射しました。 – dugla

3

のいずれかをしたい、これはサブビューがのdrawRectを受けさせる必要があります場合は、レイアウトの変更を呼び出します。私はこれをテストしていない。

+0

'setNeedsDisplay'と言うものもあれば、' setNeedsLayout'と言うものもあります。 – Sti

0

このソリューションは少しクレイジーですが、それは論理的な意味がある、と偉大な視覚的な結果を持っています。私はNSLayoutManagerと2つの列にテキストをレイアウトしているNSTextContainerを使って作業しています。私は複数のテキストコンテナを使用しています(と私はUITextView複数たくわからない)ので、私はMyDrawingView: UIViewdraw(rect: CGRect)メソッドをオーバーライドしています。契約ブレーカであることが十分に大きな -

問題がself.contentMode = .redrawを使用すると、まだ回転にストレッチいくつかのマイナーにつながるということです。

contentMode = .left、またはcontentMode = .scaleAspectFitという設定がピクセル完全回転の点で私の望むものに近いことに気付きました。しかし、明らかに、私は必要なドローコールを得ていなかった。

だから - 私は、layoutSubviews()をオーバーライドsuper.layoutSubviews()と呼ばれる、.scaleAspectFitcontentModeを切り替え、それをスイッチバック。 :P

override func layoutSubviews() { 
    self.contentMode = .scaleAspectFit 

    super.layoutSubviews() 
    self.contentMode = .redraw 
} 

これは完璧です。

関連する問題