Отрегулируйте вертикальное положение заголовка UIBarButtonItem внутри UIToolbar

Можно ли отрегулировать заголовок UIBarButtonItem внутри UIToolbar?

Я пробовал следующие строки кода без успеха:

UIBarButtonItem.appearance().setTitlePositionAdjustment(UIOffset(horizontal: 30, vertical: 30), forBarMetrics: UIBarMetrics.Default)

И этот:

self.setTitlePositionAdjustment(UIOffset(horizontal: 30, vertical: 30), forBarMetrics: UIBarMetrics.Compact)

Ответ 1

Смещение UIBarButtonItem (Text!) внутри UIToolBar по вертикали, похоже, не работает с Xcode 7 (бета-версия 6).

Вы правы, в соответствии с документами, это должно сделать это: UIBarButtonItem.appearance().setTitlePositionAdjustment

либо глобально в AppDelegate:

UIBarButtonItem.appearance().setTitlePositionAdjustment(UIOffset(horizontal: 30, vertical: 30), forBarMetrics: UIBarMetrics.Default)

или локально с самой продукцией:

(Swift)

self.myBarItem.setTitlePositionAdjustment(UIOffset(horizontal: 30, vertical: 30), forBarMetrics: UIBarMetrics.Default)

(Obj C)

[self.myBarItem setTitlePositionAdjustment:UIOffsetMake(30, 30) forBarMetrics: UIBarMetricsDefault];

Является ли это ошибкой с внешним видом?

Ответ 2

Я тоже был разочарован этим, поэтому я подклассифицировал UIBarButtonItem для работы, как ожидалось. Принимая от этого ответа, я придумал следующее:

@interface TitleAdjustingBarButtonItem(){
    UIView*   _parentView;
    UIButton* _button;
}

@end

@implementation TitleAdjustingBarButtonItem

-(id) initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action{
    _button = [[UIButton alloc] init];
    [_button setTitle:title forState:UIControlStateNormal];

    [_button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];

    [_button sizeToFit];

    _parentView = [[UIView alloc] initWithFrame:_button.bounds];

    [_parentView addSubview:_button];

    return [super initWithCustomView:_parentView];
}

#pragma mark - property setters -

-(void) setTitlePositionAdjustment:(UIOffset)adjustment forBarMetrics:(UIBarMetrics)barMetrics{
    [_button sizeToFit];
    _parentView.bounds = CGRectMake(0.0, 0.0, _button.bounds.size.width - (adjustment.horizontal * 2.0), _button.bounds.size.height - (adjustment.vertical * 2.0));
}

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

Ответ 3

Версия Swift 3 для UITabBarItem создана программно (вы можете изменить это свойство также для торговых точек):

let barItem = UITabBarItem(title: "Menu",
                           image: UIImage(named: "imageName"),
                           selectedImage: UIImage(named: "selectedImageName"))
barItem.setTitlePositionAdjustment(UIOffset(horizontal: 0, vertical: -10), for: UIBarMetrics.default)

Ответ 4

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

    let xDisplacement: CGFloat = -25 // Adjust horizontal position
    let yDisplacement: CGFloat = 9 // Adjust vertical position
    let h = (self.viewIfLoaded?.frame.size.height)!/12 //Set your height in reference to the size of the view
    let w = (self.viewIfLoaded?.frame.size.height)!//Set your width in reference to the size of the view 
//Change placement adjusting size for change.
    self.navigationController?.navigationBar.frame = CGRect(x: xDisplacement, y: yDisplacement, width: w-xDisplacement, height: h-yDisplacement)

В моем случае фон прозрачен, поэтому настройка не имеет особого значения. Также я пытался переместить заголовок влево. Я думаю, что это единственная ситуация, когда корректировка полезна.

В любом случае, просто обходной путь, но я надеюсь, что это поможет.

Всего здесь нет, отзывы оценены.

Ответ 5

Измените baselineOffset текста.

let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(self.someFunction))
let attributes = [NSAttributedString.Key.baselineOffset: NSNumber(value: -3)]
doneButton.setTitleTextAttributes(attributes, for: .normal)

Отрицательный baselineOffset сместит текст заголовка вниз, положительное значение сместит его вверх. 0 является значением по умолчанию.

Я проверял это на iOS 11.

Ответ 6

Предложение для этого: используйте UIButton внутри UIBarButtonItem.

У меня есть панель инструментов с двумя более высокими кнопками с обеих сторон (кнопка "Вверх" и кнопка "Вниз" на скриншоте), и когда пользователь запускает действие, на панели инструментов отображаются две кнопки, на которых есть только текст. Когда я изначально помещал их на панель инструментов как объекты UIBarButtonItem, они располагались очень низко на панели инструментов, и я ничего не пытался заставить их подняться выше. Из-за их положения пользователю было трудно нажимать их на устройствах iPadPro, потому что полоска внизу устройства как бы блокировала их.

Я обнаружил, что если бы я перетаскивал UIButton на панель инструментов, IB автоматически помещал бы их внутри UIBarButtonItem в качестве представления, и они были центрированы вертикально на панели инструментов. Затем я смог настроить вкладки содержимого для UIButton как обычно, и изменения были отражены правильно. (Так как я только искал их центрирование по вертикали, простое использование UIButtons работало для меня). Помните, что любые IBActions, которые вы подключаете, должны быть подключены к кнопкам UIB.

Я сделал это с XCode 10.1 и Swift 4.

Storyboard outline view