Подтвердить что ты не робот

Как я могу получить полноразмерный UINavigationBar titleView

Я пытаюсь добавить пользовательский элемент управления как 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 - Я знаю, что я могу добавить представление сам по себе, а не прикрепляться к панели навигации, и было бы очень легко разместить его самостоятельно. У меня есть причины, по которым он должен быть "on" панель навигации, и эти причины здесь

4b9b3361

Ответ 1

Настройка titleView вашего вида navigationItem никогда не будет делать трюк. Вместо этого вы можете добавить subView в навигационный контроллер navigationBar:

UIView* ctrl = [[UIView alloc] initWithFrame:navController.navigationBar.bounds];
ctrl.backgroundColor = [UIColor yellowColor];
ctrl.autoresizingMask = UIViewAutoresizingFlexibleWidth;
[navController.navigationBar addSubview:ctrl];

Ответ 2

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

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

Вот так:

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

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

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

Ответ 3

Быстрая версия ответа ksm

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
                )
       }
}

Ответ 4

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

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

  • сделайте barView (убедитесь, что ширина ширины экрана - ScreenSize - 12 * 2, 12 является системным дополнением, установленным для titleView, вы можете использовать макет вручную или ограничение автоопределения для достижения этого). а затем установите его как навигационная панель titleView
  • добавьте свои компоненты в этот barView. вы можете выровнять компоненты от -12 до ширины barView + 12
  • перегрузите пункт barViewInside, чтобы он мог реагировать даже когда клик состоялся вне 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;
    }
    

Ответ 5

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

Код в swift 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
            }
        }
    }
}

Ответ 6

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 [email protected]"Available Reports";

self.navigationItem.titleView = titlelabel;

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