Пользовательский UINavigationBar с пользовательской высотой приводит к неправильному расположению UIBarButtonItem - PullRequest
14 голосов
/ 04 января 2012

Я создал свой собственный подкласс UINavigationBar, чтобы включить пользовательский фон, который выше 44pxs.

Я сделал это, переопределив эти два метода:

-(void) drawRect:(CGRect)rect
{
    [self.backgroundImage drawInRect:CGRectMake(0, 0, self.backgroundImage.size.width, self.backgroundImage.size.height)];
}

- (CGSize)sizeThatFits:(CGSize)size 
{
    CGRect frame = [UIScreen mainScreen].applicationFrame;
    CGSize newSize = CGSizeMake(frame.size.width , self.backgroundImage.size.height);
    return newSize;
}

И вот результат:

Custom bar with custom height

Теперь моя проблема, как вы можете видеть, заключается в том, что все элементы UIBarButtonItem (и titleView) расположены внизу панели навигации.

Я бы хотел, чтобы они были прикреплены к верхней части бара (с некоторыми дополнениями, конечно). Что мне нужно переопределить, чтобы добиться этого?

Спасибо!

EDIT:

Это решение, которое я использовал:

-(void) layoutSubviews
{
    [super layoutSubviews];
    for (UIView *view in self.subviews)
    {
        CGRect frame = view.frame;
        frame.origin.y = 5;
        view.frame = frame;
    }
}

Выполняет трюк для состояния бездействия, все еще имеет странное поведение для элементов push и pop.

Ответы [ 2 ]

6 голосов
/ 04 января 2012

Попробуйте переопределить layoutSubviews: вызовите [super layoutSubviews] внутри и затем измените положение элементов.

5 голосов
/ 19 октября 2012

Для решения проблемы push / pop используйте setTitleVerticalPositionAdjustment в sizeThatFits: (CGSize) size

- (CGSize)sizeThatFits:(CGSize)size {
    UIImage *img = [UIImage imageNamed:@"navigation_background.png"];
    [self setTitleVerticalPositionAdjustment:-7 forBarMetrics:UIBarMetricsDefault];
    CGRect frame = [UIScreen mainScreen].applicationFrame;
    CGSize newSize = CGSizeMake(frame.size.width , img.size.height);
    return newSize;
}
...