Возможно ли сделать superView для перехвата layoutSubviews: из подпредставлений? - PullRequest
3 голосов
/ 10 августа 2011

Чтобы обеспечить гибкие макеты, я хотел создать подкласс UIView, который переопределяет layoutSubviews: для автоматического размещения всех его подпредставлений друг под другом и будет продолжать делать это каждый раз, когда размер одного из его подпредставлений изменяется.

Однако единственный способ сообщить супервизору, что он должен вызывать layoutSubviews:, - это переопределить этот метод в каждом из его подпредставлений, чего я хотел бы избежать (я хочу, чтобы люди быть в состоянии добавить произвольные UIViews к суперпредставлению и позаботиться об этом).

Может ли суперпредставление вызывать layoutSubviews: всякий раз, когда подпредставление меняет свой размер, без добавления какого-либо кода к рассматриваемому подпредставлению?

Ответы [ 2 ]

0 голосов
/ 10 августа 2011

Вы можете использовать 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
}
0 голосов
/ 10 августа 2011

Вы можете добавить категорию в класс и попробовать переопределить layoutSubviews: из категории. (Этот метод был предложен для настройки панелей навигации , и он вполне может работать и здесь.)

Вот как бы вы сделали категорию, взято из моего ответа здесь . В вашем случае не забудьте заменить UIView на UINavigationController.

Нажмите Ctrl + N или откройте диалоговое окно «Новый файл». Далее выберите «Категория Objective-C» из меню «Какао-тач»:

Creating a category

Нажмите Далее, и вам будет предложено ввести имя класса, к которому вы хотите добавить методы в качестве категории. Это должно выглядеть примерно так:

Making a Category on the NavBar

Затем вы должны получить диалоговое окно сохранения файла. Краткое примечание о конвенции здесь. Соглашение состоит в том, чтобы назвать категорию после исходного класса, знак плюс, а затем описание того, что вы добавляете. Вот как может выглядеть ваш:

Category Naming Convention

Как только вы сохраните свой файл, вам нужно получить что-то вроде этого:

Empty Category

Edit:

Если вы хотите пойти дальше и сделать это без категории, то лучше всего создать подкласс UIView, а затем подкласс этого класса, где бы вы ни хотели использовать свое поведение. Другое преимущество над категорией заключается в том, что ваш метод будет работать только в том случае, если вы явно используете пользовательский класс. В категориях метод добавляется везде.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...