Пользовательский UINavigationBar с настраиваемой высотой приводит к неправильному расположению UIBarButtonItem

Я создал свой собственный подкласс 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;
    }
}

Есть ли трюк в состоянии ожидания, все еще есть странное поведение при нажатии и поп-позициях.

Ответы

Ответ 1

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

Ответ 2

Чтобы решить проблему push/pop, используйте setTitleVerticalPositionAdjustment в размере sizeThatFits: (CGSize)

- (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;
}