因为后退button,导航栏的中间不能设置titleView
我正在使用图像视图在导航栏中显示图像。 问题是由于后退button,我无法正确设置到中心。 我查了一下相关的问题,之前解决了几乎相同的问题,但这次我不知道。
早些时候,我用假酒吧button解决了这个问题,所以我尝试在右侧(和左侧)添加一个假酒吧button,但是这并没有帮助。
- (void) searchButtonNavBar { CGRect imageSizeDummy = CGRectMake(0, 0, 25,25); UIButton *dummy = [[UIButton alloc] initWithFrame:imageSizeDummy]; UIBarButtonItem *searchBarButtonDummy =[[UIBarButtonItem alloc] initWithCustomView:dummy]; self.navigationItem.rightBarButtonItem = searchBarButtonDummy; } - (void)setNavBarLogo { [self setNeedsStatusBarAppearanceUpdate]; CGRect myImageS = CGRectMake(0, 0, 44, 44); UIImageView *logo = [[UIImageView alloc] initWithFrame:myImageS]; [logo setImage:[UIImage imageNamed:@"color.png"]]; logo.contentMode = UIViewContentModeScaleAspectFit; self.navigationItem.titleView = logo; [[UIBarButtonItem appearance] setTitlePositionAdjustment:UIOffsetMake(0.0f, 0.0f) forBarMetrics:UIBarMetricsDefault]; }
我认为它应该工作正常,因为在这种情况下, titleView
在同一侧有栏button。 有没有解释为什么它与编程创build的栏button一起工作,但不能与公共后退button一起使用?
只要有足够的空间, UINavigationBar
自动将它的titleView
。 如果标题不居中,这意味着标题视图太宽而无法居中,而且如果你设置了backgroundColor,如果你的UIImageView
你会看到这正是发生了什么。
标题视图过于宽泛,因为导航栏会自动调整标题以保存其内容,使用-sizeThatFits:
这意味着您的标题视图将始终按照您的图像大小resize。
两个可能的修复:
-
你使用的图像太大了。 使用2x和3x版本的正确大小的44×44点图像。
-
将UIImageView封装在常规UIView中以避免resize。
例:
UIImageView* imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.jpeg"]]; imageView.contentMode = UIViewContentModeScaleAspectFit; UIView* titleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 44, 44)]; imageView.frame = titleView.bounds; [titleView addSubview:imageView]; self.navigationItem.titleView = titleView;
Darren第二种方式的Swift 3版本中的一个例子:
let imageView = UIImageView(image: UIImage(named: "test")) imageView.contentMode = UIViewContentMode.scaleAspectFit let titleView = UIView(frame: CGRect(x: 0, y: 0, width: 44, height: 44)) imageView.frame = titleView.bounds titleView.addSubview(imageView) self.navigationItem.titleView = titleView
不要使用titleView。
只需将您的图像添加到navigationController.navigationBar
CGRect myImageS = CGRectMake(0, 0, 44, 44); UIImageView *logo = [[UIImageView alloc] initWithFrame:myImageS]; [logo setImage:[UIImage imageNamed:@"color.png"]]; logo.contentMode = UIViewContentModeScaleAspectFit; logo.center = CGPointMake(self.navigationController.navigationBar.width / 2.0, self.navigationController.navigationBar.height / 2.0); logo.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin; [self.navigationController.navigationBar addSubview:logo];
我build议你重写函数 – (void)setFrame:(CGRect)fram是这样的:
- (void)setFrame:(CGRect)frame { [super setFrame:frame]; //systom function self.center = CGPointMake(self.superview.center.x, self.center.y); //rewrite function }
这样titleView.center总是正确的位置
群力为我工作得很好 这里是快速的2.3代码:
override var frame: CGRect { set(newValue) { super.frame = newValue if let superview = self.superview { self.center = CGPoint(x: superview.center.x, y: self.center.y) } } get { return super.frame } }
如果您使用的是笔尖的自定义视图,请确保在nib文件上禁用自动布局。
1)您可以尝试通过调用将图像设置为UINavigationBar的背景图像
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"color.png"] forBarMetrics:UIBarMetricsDefault];
在viewDidLoad
方法里面。
这样它将始终居中,但是如果您将具有长标题的button作为左导航项目,则可能会出现在您的徽标顶部。 你应该首先创build另一个与导航栏大小相同的图像,然后在其中心绘制图像,然后将其设置为背景图像。
2)或者,您可以将图像视图设置为titleView
,而不是将图像视图设置为titleView
,只需添加at作为子视图,这样就不会有左右栏button项的约束。
我创build了一个自定义的UINavigationController
,当你想隐藏时,你只需要调用showNavBarTitle(title:font:)
当你想要显示和removeNavBarTitle()
:
class NavigationController: UINavigationController { private static var mTitleFont = UIFont(name: <your desired font (String)> , size: <your desired font size -- however, font size will automatically adjust so the text fits in the label>)! private static var mNavBarLabel: UILabel = { let x: CGFloat = 60 let y: CGFloat = 7 let label = UILabel(frame: CGRect(x: x, y: y, width: UIScreen.main.bounds.size.width - 2 * x, height: 44 - 2 * y)) label.adjustsFontSizeToFitWidth = true label.minimumScaleFactor = 0.5 label.font = NavigationController.mTitleFont label.numberOfLines = 0 label.textAlignment = .center return label }() func showNavBarLabel(title: String, font: UIFont = mTitleFont) { NavigationController.mNavBarLabel.text = title NavigationController.mNavBarLabel.font = font navigationBar.addSubview(NavigationController.mNavBarLabel) } func removeNavBarLabel() { NavigationController.mNavBarLabel.removeFromSuperview() } }
我发现调用showNavBarTitle(title:font:)
和removeNavBarTitle()
的最佳位置分别在视图控制器的viewWillAppear()
和viewWillDisappear()
方法中:
class YourViewController: UIViewController { func viewWillAppear() { (navigationController as! NavigationController).showNavBarLabel(title: "Your Title") } func viewWillDisappear() { (navigationController as! NavigationController).removeNavBarLabel() } }
在Swift中,这对我来说是有效的,但它不是最好的解决scheme(基本上,将其添加到navigationBar中):
let titleIV = UIImageView(image: UIImage(named:"some")) titleIV.contentMode = .scaleAspectFit titleIV.translatesAutoresizingMaskIntoConstraints = false if let navigationController = self.navigationController{ navigationController.navigationBar.addSubview(titleIV) titleIV.centerXAnchor.constraint(equalTo: navigationController.navigationBar.centerXAnchor).isActive = true titleIV.centerYAnchor.constraint(equalTo: navigationController.navigationBar.centerYAnchor).isActive = true } else{ view.addSubview(titleIV) titleIV.topAnchor.constraint(equalTo: view.topAnchor, constant: UIApplication.shared.statusBarFrame.height).isActive = true titleIV.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true }