UIBarButtonItem: setBackgroundVerticalPositionAdjustment не работает должным образом с пользовательской кнопкой

У меня есть следующий код для настройки отображения UIBarButtonItem (locationButton):

    UIButton *locationButtonAux = [UIButton buttonWithType:UIButtonTypeCustom];
    [locationButtonAux setFrame:CGRectMake(0, 0, LOCATION_BUTTON_WIDTH, LOCATION_BUTTON_HEIGHT)];
    [locationButtonAux setBackgroundImage:[UIImage imageNamed:@"location_button.png"] forState:UIControlStateNormal];
    [locationButtonAux setBackgroundImage:[UIImage imageNamed:@"location_button.png"] forState:UIControlStateHighlighted];
    [locationButtonAux addTarget:self action:@selector(userLocation) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *locationButton = [[UIBarButtonItem alloc] initWithCustomView:locationButtonAux];
    UIBarButtonItem * item = [[UIBarButtonItem alloc] initWithTitle:@"title"
                                                              style:UIBarButtonItemStyleDone
                                                             target:nil action:@selector(someMssage)];
    [locationButton setBackgroundVerticalPositionAdjustment:-20.0 forBarMetrics:UIBarMetricsDefault];
    self.navigationItem.rightBarButtonItem = locationButton;

И я хочу настроить положение этой кнопки на панели навигации, потому что моя панель навигации выше, чем обычно (настраивается с помощью внешнего вида).

Я использую для этого метод setBackgroundVerticalPositionAdjustment, как вы можете видеть в коде. Но с моим UIBarButtonItem вообще не работает, независимо от того, какое смещение я там указал, кнопка всегда появляется близко к нижней части панели (моментальный снимок). НО, если я использую обычный UIBarButtonItem с обычным стилем (тот, который я назвал кнопкой), я ДЕЙСТВИТЕЛЬНО вижу, как положение кнопки будет изменено со смещением -20. Очень странно... Есть идеи?

Спасибо!

введите здесь описание изображения


person jcardenete    schedule 08.05.2013    source источник
comment
Взгляните на stackoverflow.com/a/16442006/1328096, это будет вам полезно.   -  person jamil    schedule 08.05.2013
comment
Спрашивающий, который никогда не принимает ответы (галочка), не мотивирует людей тратить время на помощь ему.   -  person matt    schedule 10.05.2013


Ответы (2)


Возможно, что-то вроде этого сработает для вас:

UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 150, 30)]; //change this frame to counteract for your taller navbar
[rightView addSubview:locationButtonAux];
UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:rightView];
self.navigationItem.rightBarButtonItem = rightBarButtonItem;

Надеюсь это поможет

person joeByDesign    schedule 08.05.2013

Вам нужно поместить кнопку внутри пустого представления и расположить ее в этом пустом представлении. Теперь сделайте это представление пользовательским представлением элемента кнопки панели.

Здесь вам действительно не нужна кнопка, так как это просто изображение, и вы не используете какие-либо возможности кнопки (вы можете подключить распознаватель жестов, чтобы обнаружить нажатие). Итак, вот простое решение с использованием представления изображения:

UIImageView *locationButtonAux = 
    [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"location_button.png"]];
UIView* v = [[UIView alloc] initWithFrame:locationButtonAux.frame];
[v addSubview:locationButtonAux];
CGRect f = locationButtonAux.frame;
f.origin.y -= 10;
locationButtonAux.frame = f;
UIBarButtonItem *locationButton = [[UIBarButtonItem alloc] initWithCustomView:v];
self.navigationItem.rightBarButtonItem = locationButton;

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

person matt    schedule 08.05.2013