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