Как я могу получить полноразмерный заголовок UINavigationBar - PullRequest
19 голосов
/ 21 сентября 2010

Я пытаюсь добавить пользовательский элемент управления в качестве titleView в UINavigationBar.Когда я делаю это, несмотря на установку рамки и свойств, которые обычно принимают полную ширину, я получаю это: alt text

Ярко-синий можно игнорировать, поскольку именно там я скрываю свой пользовательский элемент управления.Проблема в узких полосках навбара на концах бара.Как я могу избавиться от них, чтобы мой пользовательский вид растянулся на 100%?

CGRect frame = CGRectMake(self.view.bounds.origin.x, self.view.bounds.origin.y, self.view.width, kDefaultBarHeight);
UANavBarControlView *control = [[[UANavBarControlView alloc] initWithFrame:frame] autorelease];
control.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
self.navigationItem.titleView = control;

PS - я знаю, что могу добавить вид самостоятельно, вместо того, чтобы присоединяться к панели навигации, и было бы очень легкоПозиционируй это сам.У меня есть причины, по которым он должен быть «на» панели навигации, и эти причины здесь

Ответы [ 6 ]

28 голосов
/ 29 марта 2012

Просто столкнулся с той же проблемой и, подумав, решил ее. Фрейм titleView устанавливается с помощью панели навигации каждый раз, когда он появляется.

Все, что вам нужно сделать, это подкласс UIView и переопределить setFrame.

Как это:

    - (void)setFrame:(CGRect)frame {
        [super setFrame:CGRectMake(0.0, 0.0, 320.0, 50.0)];
    }

Теперь установите свой подлый новый UIView в качестве navigationItem.titleView и наслаждайтесь его новым сопротивлением изменению размеров благодаря суперпредставлению

Вам не нужно устанавливать суперкадр каждый раз, когда ваш кадр устанавливается. Вы можете просто установить его один раз и сделать. Если вы хотите поддержать изменения ориентации, вы, возможно, тоже взломаете это.

24 голосов
/ 23 сентября 2010

Установка titleView элемента view вашего навигационного элемента никогда не сработает.Вместо этого вы можете добавить подпункт к панели навигации контроллера навигации:

UIView* ctrl = [[UIView alloc] initWithFrame:navController.navigationBar.bounds];
ctrl.backgroundColor = [UIColor yellowColor];
ctrl.autoresizingMask = UIViewAutoresizingFlexibleWidth;
[navController.navigationBar addSubview:ctrl];
3 голосов
/ 19 сентября 2017

Следующий код написан на iOS8 / iOS9 / iOS10 / iOS11 .

Код в быстром 3

class TitleView: UIView {

    override var frame: CGRect {
        get {
            return super.frame
        }
        set {
            super.frame = newValue.insetBy(dx: -newValue.minX, dy: 0)
        }
    }

    override func didMoveToSuperview() {
        if let superview = superview {
            frame = superview.bounds
            translatesAutoresizingMaskIntoConstraints = true
            autoresizingMask = [.flexibleWidth, .flexibleHeight]
        }
    }

    override func updateConstraints() {
        super.updateConstraints()
        /// remove autolayout warning in iOS11
        superview?.constraints.forEach { constraint in
            if fabs(constraint.constant) == 8 {
                constraint.isActive = false
            }
        }
    }
}
0 голосов
/ 18 июля 2017

спасибо @VdesmedT за ответы, я использовал этот ответ для получения полноразмерного заголовка ViewView в навигационной панели.

Но я недавно обновился до iOS11 и обнаружил, что это решение неРабота.И вот я понял это по-другому (может показаться странным).Суть идеи не в том, чтобы изменить размер titleView, а в том, чтобы изменить подвиды панели для достижения полноэкранной панели. Это влияет на

  1. создание barView (убедитесь, что ширина barView равна screenSize - 12 *2, 12 - это заполнение системы, установленное на titleView, вы можете использовать ручное расположение или ограничение autolayout для достижения этой цели).и затем установите его как titleView панели навигации
  2. и добавьте свои компоненты в этот barView.Вы можете выровнять компоненты от -12 до ширины barView + 12
  3. перегрузить pointInside вашего barView, чтобы сделать его отзывчивым, даже если щелчок произошел за пределами barView.

    - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
     {
      BOOL ret = [super pointInside:point withEvent:event];
      if (ret == NO)
      {
        CGRect expandRect = UIEdgeInsetsInsetRect(self.bounds, UIEdgeInsetsMake(0, -12, 0, -12));
        ret = CGRectContainsPoint(expandRect, point);
    }
    return ret;
    }
    
0 голосов
/ 05 июня 2017

Свифт версия ответа КСМ

let leftOffset: CGFloat = 60
let rightOffset: CGFloat = 60

@objc override var frame: CGRect {
     didSet {
                let width: CGFloat = UIScreen.main.bounds.width - leftOffset - rightOffset
                let height: CGFloat = 44

                super.frame = CGRect(
                    x: leftOffset,
                    y: 20,
                    width: width,
                    height: height
                )
       }
}
0 голосов
/ 04 октября 2010

CGRect frame = CGRectMake (0, 0, 320, 44);

UILabel *titlelabel = [[UILabel alloc]initWithFrame:frame];

titlelabel.textAlignment = UITextAlignmentCenter;

titlelabel.backgroundColor = [UIColor clearColor];

titlelabel.textColor = [UIColor whiteColor];

titlelabel.font = [UIFont systemFontOfSize:20];

titlelabel.text =@"Available Reports";

self.navigationItem.titleView = titlelabel;

если вы хотите установить изображение, а затем использовать вид uiimage вместо uilable, вы можете создать любой вид полностью навигационной панели, просто скажите мне, как выглядит ваша навигация, я пришлю вам код для этого, если вы хотите, я могу поставить 6 кнопок на навигацию также

...