3

layoutSubviews:柔軟なレイアウトを可能にするために、すべてのサブビューを自動的に相互にレイアウトするようにオーバーライドし、サブビューの1つがサイズ変更されるたびにこれを継続するサブクラスUIViewを作成したいと思いました。

ただし、スーパービューに呼び出す必要があることを知らせるために考えられる唯一の方法はlayoutSubviews:、各サブビューでそのメソッドをオーバーライドすることです。これは避けたいことです(ユーザーが任意のUIViewを追加できるようにしたい)監督にそしてこれを世話してもらいます)。

問題のサブビューにコードを追加せずlayoutSubviews:に、サブビューのサイズが変更されるたびにスーパービューが呼び出す方法はありますか?

4

2 に答える 2

0

クラスにカテゴリを追加して、カテゴリ内からオーバーライドを試みることができlayoutSubviews:ます。(この手法は、ナビゲーション バーをカスタマイズするために提案されており、ここでもうまく機能する可能性があります。)

私の回答 here から抜粋した、カテゴリの作成方法は次のとおりです。あなたの場合、忘れずに に置き換えUIViewてくださいUINavigationController

Command+N を押すか、[新しいファイル] ダイアログを開きます。次に、Cocoa Touch メニューから「Objective-C カテゴリ」を選択します。

カテゴリの作成

[次へ] をクリックすると、メソッドをカテゴリとして追加するクラスの名前を入力するよう求められます。次のようになります。

NavBar にカテゴリを作成する

次に、ファイルの保存ダイアログが表示されます。ここでコンベンションについて簡単に説明します。慣習として、元のクラス、プラス記号、追加する内容の説明の後にカテゴリを指定します。あなたの場合は次のようになります。

カテゴリの命名規則

ファイルを保存したら、次のようなものが必要になります。

空のカテゴリ

編集:

先に進み、カテゴリなしでこれを行う場合は、UIView のサブクラスを作成し、カスタム動作が必要な場所でそのクラスをサブクラス化することをお勧めします。カテゴリに対するもう 1 つの利点は、カスタム クラスを明示的に使用する場合にのみメソッドが機能することです。カテゴリでは、メソッドはどこにでも追加されます。

幸運を!

于 2011-08-10T13:20:16.623 に答える
0

KVO を使用してframe、各サブビューのプロパティを観察できます。サブビューが追加されるたびに自分自身をオブザーバーとして追加し、サブビューが削除されたときに観察を削除する必要があります。オーバーライドdidAddSubview:willRemoveSubview:て、スーパービューでそれを行うことができます。

- (void)didAddSubview:(UIView *)subview {
    [subview addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];
}

- (void)willRemoveSubview:(UIView *)subview {
    [subview removeObserver:self forKeyPath:@"frame"];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"frame"]) {
         // Do your layout here...
    }
}

- (void)dealloc {
    // You might need to remove yourself as an observer here, in case
    // your subviews are still used by others
}
于 2011-08-10T14:09:18.360 に答える