ページ 11

iOSでUIViewで移動やサイズ変更された時に知る方法

Posted: 2013年8月25日(日) 10:41
by obott
UIViewで移動やサイズ変更された時に知る方法を探しています。

iOS 5.0 Xcode4.3 以降対応を基本に考えています。

特定のUIViewのプロパティのframeやcenterが変更されたら知りたいのです。
(実際に表示されていない時は知れなくても良いのですが、、)

UIViewの派生クラス(AViewとします)を作ってその中で、AViewが移動やサイズ変更された時AViewの兄弟のBViewの位置やサイズをコントロールしたいのです。
BViewはAViewのプロパティ等で記憶しようと思っています。

色々ググってみましたが、、見つけられませんでした。

ご存じの方よろしくお願いします。

Re: iOSでUIViewで移動やサイズ変更された時に知る方法

Posted: 2013年8月25日(日) 10:51
by obott
補足説明です。
MFCでいう、
CWnd::OnMove
CWnd::OnMoving
CWnd::OnSize
CWnd::OnSizing
みたいな物があるかと思ったのですが見つけられなかったです。

Re: iOSでUIViewで移動やサイズ変更された時に知る方法

Posted: 2013年8月25日(日) 12:15
by へにっくす
obott さんが書きました:補足説明です。
MFCでいう、
CWnd::OnMove
CWnd::OnMoving
CWnd::OnSize
CWnd::OnSizing
みたいな物があるかと思ったのですが見つけられなかったです。
詳しくは知りませんが以下のlayoutセクションで、sizeThatFits、layoutSubviews、didAddSubview、willRemoveSubview、willMoveToSuperview、didMoveToSuperview、willMoveToWindow、didMoveToWindowが挙げられています。
これらのメソッドをオーバーライドしてみたらいかがでしょうか。
(見当はずれでしたらすみません)
UIView Class Reference

Re: iOSでUIViewで移動やサイズ変更された時に知る方法

Posted: 2013年8月25日(日) 15:32
by obott
へにっくす さんが書きました: 詳しくは知りませんが以下のlayoutセクションで、sizeThatFits、layoutSubviews、didAddSubview、willRemoveSubview、willMoveToSuperview、didMoveToSuperview、willMoveToWindow、didMoveToWindowが挙げられています。
実は確認済みだったのですが明記してませんでした。
UIViewの派生クラス(AViewとします)のソースでそれらの関数をオーバーライドして各関数の中でブレークを掛けて、、実行してみました。

willMoveToSuperviewとdidMoveToSuperviewとwillMoveToWindowとdidMoveToWindowとかは最初の親ビューへの登録か表示時には呼ばれました。

しかし肝心の、、、、、、
AView.frame = CGRecyMake( 0, 0, 100, 200 );
AView.center = CGPointMake( 50, 80 );
等の所ではブレークしませんでした。


sizeToFitsとsizeThatFitsは何らかの設定をすると呼ばれるのかなと思いますが、、、、、、、
↑の関数はなにか設定で目的に合致するように成るのかなと思ったので確認済みだと明記しなかったのです。

Re: iOSでUIViewで移動やサイズ変更された時に知る方法

Posted: 2013年8月25日(日) 15:47
by h2so5
プロパティの変更を監視する場合は Key Value Observing という方法があるみたいです。
https://developer.apple.com/library/mac ... rving.html

Re: iOSでUIViewで移動やサイズ変更された時に知る方法

Posted: 2013年8月26日(月) 09:06
by obott
h2so5 さんが書きました:プロパティの変更を監視する場合は Key Value Observing という方法があるみたいです。
h2so5 さん ありがとうございます。

おかげさまで
AViewが移動やサイズ変更された時AViewの兄弟のBViewの位置やサイズをコントロールしたいのです。
が出来る様になりました。

コード:

	[self addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];
	[self addObserver:self forKeyPath:@"center" options:NSKeyValueObservingOptionNew context:nil];
AViewのソースで上記の様にプロパティ変更時に通知が来る様にセット出来ました。
当然と言えば当然かもしれませんが、、、
Animation中はプロパティそのものが変化しているのでは無い様で通知は来ないみたいです。