it-swarm.com.ru

пользовательский UINavigationBar iOS 7 TitleView перемещается при нажатии или выталкивании нового View Controller

Я использую пользовательский вид заголовка для UINavigationBar со следующим кодом:

// Set a label to the nav bar
THLabel *titleLabel = [[THLabel alloc] init];
titleLabel.text = @"Test";
titleLabel.font = [UIFont fontWithName:APP_FONT size:22.0];
titleLabel.frame = CGRectMake(0, 0, 100, 30);
titleLabel.textAlignment = NSTextAlignmentCenter;
titleLabel.textColor = CUSTOM_LIGHT_BLUE;
titleLabel.strokeColor = kStrokeColor;
titleLabel.strokeSize = kStrokeSize;
self.navigationItem.titleView = titleLabel;

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

Смотрите видео здесь: https://www.youtube.com/watch?v=961CCVQmpJM&feature=youtu.be

Я отключил автоматическое изменение размера каждого подпредставления для контроллера навигации с раскадровкой и в коде для каждого контроллера представления:

    // Set the navigation bar hidded on the log in view
    UINavigationController* mainViewController = (UINavigationController*)self.appDelegate.window.rootViewController;
    [mainViewController setNavigationBarHidden:YES];
    [[mainViewController navigationBar] setAutoresizesSubviews:NO];

Однако это все еще изменяет размеры! Как я могу остановить это - что я делаю не так? Спасибо!

24
PhilBot

Это воспроизводимо для меня, только если я помещаю параметр titleView code в viewWillAppear . Перемещение в viewDidLoad исправляет проблему

33
Alex Peda

Я бы вставил метку в переменную UIView. Интерфейсный Разработчик не любит вставлять непосредственно UILabel в titleView по какой-то причине, которая может быть связана с вашей проблемой.

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

4
Rivera

Это случилось и со мной. Вы могли бы сделать две вещи:

1) убедитесь, что настройка навигации выполняется либо в viewDidLayoutSubviews, либо в viewDidLoad, как указано в ответе выше. 

2) у меня был элемент левой и правой панели кнопок как nil, но я вызывал их только после того, как была установлена ​​метка заголовка. Убедитесь, что для кнопок с правой и левой полосами установлено значение nil (если вы, конечно, не используете их), прежде чем устанавливать метку заголовка в titleview.

1
hellorrr

Для меня работало создание переменной в контроллере представления, которая содержит желаемый заголовок, и инициализацию его в viewDidLoad. Затем вы можете установить это представление на self.navigationItem.titleView в viewWillAppear, и оно должно отображаться правильно. Нет необходимости устанавливать autoResizeMask или rightBarButtons и т.д.

Пример:

class ViewController {
    var myTitleImage: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        myTitleImage = UIImageView(frame: CGRect(x: 0, y: 0, width: 25, height: 25))
        myTitleImage.contentMode = .scaleAspectFit
        myTitleImage.image = #imageLiteral(resourceName: "my_title_image")
        // etc...
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationItem.titleView = self.myTitleImage
    }    
}
0
Alphonsus

В моем случае это произошло потому, что я устанавливал UIBarButton перед titleView. Установка titleView должна быть первой. Работает отлично сейчас.

0
Michał Kwiecień

Разбираясь с ответом @Alex Peda выше, я обнаружил, что на iOS7, за пределами viewDidLoad, для настраиваемого заголовка, кажется, есть минимальная ширина заголовка. Вот что я делаю ниже. Обратите внимание, что ниже приведены несколько методов, специфичных для моего кода.

#define MAX_TITLE_WIDTH 400
#define MIN_TITLE_WIDTH 150

- (void) setNavBarTitle: (NSString *) newTitle;
{
    if (!newTitle) newTitle = @"";
    NSMutableString *title = [newTitle mutableCopy];

    if (![_titleView.text isEqualToString:title]) {

        NSAttributedString *attrTitle = [UIAppearance attributedString:title withFontType:FontTypeTitle | FontTypeBold | FontTypeItalic size: 40.0 andOtherAttributes:@{NSForegroundColorAttributeName: [UIColor blackColor]}];
        _titleView.attributedText = attrTitle;
        [_titleView sizeToFit];

        // In iOS7, if you set the nav bar title with a custom view outside of viewDidLoad, there appears to be a minimum title width. Narrower custom view titles are not centered properly. I'm working around this by centering the text in the label, and setting the width of the label to the minimum width.
        if ([Utilities ios7OrLater]) {
            if (_titleView.frameWidth < MIN_TITLE_WIDTH) {
                _titleView.textAlignment = NSTextAlignmentCenter;
                _titleView.frameWidth = MIN_TITLE_WIDTH;
            }
        }

        if (_titleView.frameWidth > MAX_TITLE_WIDTH) {
            _titleView.frameWidth = MAX_TITLE_WIDTH;
        }
    }

    self.navigationItem.titleView = _titleView;
}
0
Chris Prince