Sid*_*Koh 27 iphone uinavigationitem
我注意到titleView的位置取决于右侧按钮标题.如何将titleView的框架设置为居中?
我试过设置titleView.frame,但无济于事.
这是代码:
UIButton *titleLabel = [UIButton buttonWithType:UIButtonTypeCustom];
[titleLabel setTitle:@"Right Eye" forState:UIControlStateNormal];
[titleLabel setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[titleLabel setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted];
titleLabel.frame = CGRectMake(100, 0, 180, 44);
titleLabel.titleLabel.backgroundColor = [UIColor clearColor];
titleLabel.titleLabel.font = [UIFont boldSystemFontOfSize:20.0];
titleLabel.titleLabel.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.3];
// titleLabel.titleLabel.textAlignment = UITextAlignmentCenter; (this doesn't work either)
[titleLabel addTarget:self action:@selector(titleTap:) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.titleView = titleLabel;
self.navigationItem.titleView.frame = CGRectMake(100, 0, 180, 44); //(this doesn't work either)
Run Code Online (Sandbox Code Playgroud)

Pie*_*ton 46
在视图控制器的viewWillAppear:&viewDidAppear:之间的某个时间,导航栏正在重新定位titleView,并在必要时调整其大小.它最终会被取消因为导航栏更喜欢不调整titleView以适应按钮之间.它似乎试图将标题视图居中,如果它足够小,但如果没有将你的titleView偏离中心,然后我认为只有最后的手段才会调整大小.结果是titleView占据了两个按钮之间的所有空间,如果它的textAlignment居中,那么它将居中在该空间中,但不是相对于整个屏幕居中.您可以在屏幕截图中看到这一点.
一个答案是使你的titleView更窄,以便导航栏可以居中,所以当你设置titleView.frame时,尝试大约160而不是180.很糟糕的是,当您以编程方式创建视图时,必须将该宽度的估计值放入代码中.什么是好的是在保持居中的同时最大化空间的方法.
可以从titleView作为屏幕宽度开始,然后在导航栏更改titleView.frame之后,在视图控制器的viewDidAppear中自己再次更新它.使用其调整后的titleView.frame.origin.x和size.width以及屏幕宽度,您可以计算左右边距中的最大值,然后将origin.x设置为该值,将size.width设置为屏幕宽度减去那个时间2.然而,直到推动的视图已经动画化并且之后的移动可见之后,这才会生效.您可以在viewWillAppear中隐藏titleView:然后在viewDidAppear中取消隐藏:在居中后,不要使用偏移的titleView滑入,然后移动,它将滑入而没有出现的标题.
更好的可能性是让你的标题查看你自己的UIView(或UILabel或其中任何一个)的子类,并覆盖setFrame来调整自身大小以保持其超级视图的中心.如果我自己最终这样做,我会在这里发布.或者也许其他人知道另一个地方在更新后更改titleView的框架,但在视图滑入之前没有视图子类.
Alf*_*sen 18
设置titleView或titleLabel后,请调用sizeToFit它,同时确保titleLabel.textAlignment = UITextAlignmentCenter.它将以导航栏的宽度为中心,而不是在导航栏的按钮边缘和远边缘之间的空间中.
And*_*sak 12
这里没有任何建议对我有用.我的问题是我在导航栏处于转换过程中时设置了titleView - 我会得到这个奇怪的抖动,其中titleView会闪烁到左边,然后最终回到中心.
我最终遵循了smallduck的想法并重写了setFrame,就像这样简单:
- (void)setFrame:(CGRect)frame {
[super setFrame:CGRectMake(0, 0, self.superview.bounds.size.width, self.superview.bounds.size.height)];
}
Run Code Online (Sandbox Code Playgroud)
小智 6
您可以尝试最初将帧设置为CGRectZero并调用sizeToFit.下面是我用来更改标题文本并确保它仍然居中的代码.我左边有一个后退按钮.
UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
label.text = @"Title";
[label sizeToFit];
self.navigationItem.titleView = label;
Run Code Online (Sandbox Code Playgroud)