Переопределите layoutSubviews для вызова [super layoutSubviews], а затем найдите и измените положение кнопки.

Я пытаюсь переместить свой UIBarButtonItem так, чтобы его края находились сверху и справа от UINavigationBar. Я нашел этот принятый ответ о том, как это сделать, но я не действительно понимаю, как это кодировать.

Я начал с создания нового класса с именем CustomNavBar, который наследуется от UINavigationBar. Затем я поместил этот метод в реализацию:

- (void) layoutSubviews
{


}

Что я не понимаю, так это часть ответа, в которой говорится

call [super layoutSubviews] and then find and reposition the button's view.

Как мне это закодировать? Даже толчок в правильном направлении был бы полезен. Спасибо!


person Eric Brotto    schedule 10.11.2011    source источник


Ответы (2)


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

- (void) layoutSubviews
{
    [super layoutSubviews];

    for (UIView *view in self.subviews) {   // Go through all subviews
        if (view == buttonYouWant) {  // Find the button you want
            view.frame = CGRectOffset(view.frame, 0, -5);   // Move it
        }
    }
}
person voidStern    schedule 10.11.2011

Вы можете просмотреть подвиды и сравнить, является ли текущий тот, который вам нужен, используя NSClassFromString, например, так:

-(void)layoutSubviews {
    [super layoutSubviews];
    for (UIView *view in self.subviews) {
        if ([view isKindOfClass:NSClassFromString(@"TheClassNameYouWant")]) {
            // Do whatever you want with view here
        }
    }
}

Вы также можете использовать NSLog в цикле for, чтобы увидеть различные подпредставления.

person phi    schedule 29.11.2011
comment
Почему вы когда-либо хотели использовать NSClassFromString вместо [TheClassNameYouWant class]? В последнем случае вы получите предупреждения после рефакторинга, чего не было бы в первом случае. - person Zappel; 14.07.2015
comment
Я предполагаю, что [TheClassNameYouWant class] также должен быть более производительным - person yano; 11.08.2015