Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在导航栏中跨所有UIViewController将图像居中?Swift/Obj-C_Ios_Swift - Fatal编程技术网

Ios 如何在导航栏中跨所有UIViewController将图像居中?Swift/Obj-C

Ios 如何在导航栏中跨所有UIViewController将图像居中?Swift/Obj-C,ios,swift,Ios,Swift,视觉上的问题: 我试着把图像放在它自己框架的中心,但运气不好。我也试着用CGRect的x来居中,但也没有运气。我想我可以放一个与导航栏背景相同的空图标;然而,我不想这样做。我可能有2-3个图标在右边;然后呢 let image = UIImage(named: "some_logo")! let imageSize = CGSizeMake(60, 42) let marginX: CGFloat = (self.navigationController!.naviga

视觉上的问题:

我试着把图像放在它自己框架的中心,但运气不好。我也试着用CGRect的
x
来居中,但也没有运气。我想我可以放一个与导航栏背景相同的空图标;然而,我不想这样做。我可能有2-3个图标在右边;然后呢

    let image = UIImage(named: "some_logo")!
    let imageSize = CGSizeMake(60, 42)
    let marginX: CGFloat = (self.navigationController!.navigationBar.frame.size.width / 2) - (imageSize.width / 2)
    let imageView = UIImageView(frame: CGRect(x: marginX, y: 0, width: imageSize.width, height: imageSize.height))
    imageView.image = image
    imageView.contentMode = .ScaleAspectFit

    self.navigationItem.titleView = imageView
我更喜欢swift,但也欢迎obj-c解决方案

欢迎指点


这个应用程序与起亚无关,它只是我从谷歌搜索中得到的一些徽标,搜索“一些徽标”。

我曾经遇到过这个问题,最后我发现问题是以前的导航栏标题仍然位于burger button旁边,但它是不可见的

快速解决方案(但不确定是否最好)是在显示下一个视图控制器之前将上一个导航栏标题更改为空字符串


希望能有所帮助。

我也遇到过同样的问题。然后我尝试了下面显示的一个代码

 override func viewDidAppear(animated: Bool) {

    let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 150, height: 40))
    imageView.contentMode = .ScaleAspectFit

    let image = UIImage(named: "googlePlus")
    imageView.image = image

    navigationItem.titleView = imageView
  }
当我使用左栏和右栏按钮进行测试时,该代码运行良好

但在我之前的代码中,没有右栏按钮

所以图像向右移动

为了解决这个问题,我创建了一个右栏按钮&将着色颜色更改为透明颜色


看来一切都很顺利。这是您问题的一个临时解决方案。

如问题标题所述“Swift/Obj-C”,因此我将分享Obj-C的代码:

UIImageView *titleImage = (UIImageView *)self.navigationItem.titleView;
titleImage = [[UIImageView alloc]initWithFrame:CGRectMake((self.navigationController.navigationBar.frame.size.width/2) - (100/2), 0, 100,self.navigationController.navigationBar.frame.size.height)];

//setting the image for UIImageView
titleImage.image = [UIImage imageNamed:@"someLogo"];
titleImage.contentMode = UIViewContentModeCenter;
self.navigationItem.titleView = titleImage;

将图像的中心设置为navigationBar.center,而不是设置边距,怎么样

//assuming we already have our navigationController
let myNicelLogoWidth = 100
let myNiceLogoHeight = 50
//start positioning your logo at 0.0, 0.0
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: myNicelLogoWidth, height: myNiceLogoHeight))
imageView.contentMode = .scaleAspectFit
imageView.center = navigationBar.center //the put your image at the center

let image = UIImage(named: "myNiceLogoImage")
imageView.image = image


navigationItem.titleView = imageView

最简单的方法是使用Interface Builder

只需从对象库中拖动“NavigationItem”并将其放置到ViewController中,然后将UIView放置在标题所在的位置(确保将背景设置为“清除”)
然后将UIImageView放入该视图中,并将属性检查器中的图像设置为所需的图像。相应地缩放UIImage并设置相应的约束。

我创建了一个扩展,使用@idrougge的提示来解决这个问题

为了使标题视图图像居中,无论您有什么按钮,都会将内容视图设置为标题视图,然后将图像视图添加为内容视图的子视图。最后,使用约束,图像视图在其父视图(内容视图)内对齐

导入UIKit
扩展UIViewController{
func addLogoToNavigationBarItem(){
让imageView=UIImageView()
imageView.TranslatesAutoResizezingMaskintoConstraints=false
imageView.heightAnchor.constraint(equalToConstant:).isActive=true
imageView.contentMode=.ScaleSpectFit
imageView.image=
//imageView.backgroundColor=.lightGray
//要使标题视图图像居中(无论有什么按钮),请不要设置
//图像视图作为标题视图,因为它不起作用。如果只有一个按钮,图像
//将不会对齐。相反,内容视图设置为标题视图,然后图像视图将被对齐
//添加为内容视图的子视图。最后,使用约束对齐图像视图
//在其父代内部。
让contentView=UIView()
self.navigationItem.titleView=contentView
self.navigationItem.titleView?.addSubview(图像视图)
imageView.centerXAnchor.constraint(等式:contentView.centerXAnchor).isActive=true
imageView.centerYAnchor.constraint(等式:contentView.centerYAnchor).isActive=true
}
}
我希望这对某人有帮助


哈维在尺寸较小的手机上也有同样的问题。标题中的图像向右移动。导致此问题的返回按钮->[返回按钮][标题视图]。当没有后退按钮或右栏按钮时,其居中。Richard Hope的观点是正确的,您只需要先放置UIView,然后将UIImageView作为子视图。可以通过编程方式这样做。

private var imageView: UIView {

    let bannerWidth = navigationBar.frame.size.width * 0.5 // 0.5 its multiplier to get correct image width
    let bannerHeight = navigationBar.frame.size.height

    let view = UIView()
    view.backgroundColor = .clear
    view.frame = CGRect(x: 0, y: 0, width: bannerWidth, height: bannerHeight)

    let image = UIImage(named: "your_image_name")
    let imageView = UIImageView(image: image)
    imageView.contentMode = .scaleAspectFit
    imageView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height)

    view.addSubview(imageView)

    return view
}
刚更改的标题视图

navigationItem.titleView = imageView

哎呀。我忘了。thanx,添加了代码。
navigationController.navigationBar.center
不工作,因为整个
center
被导航栏按钮偏移:
navigationBar.frame:(0.0,20.0,320.0,44.0)
navigationBar.center:(160.0,42.0)
这也可以通过编程方式工作。创建具有必备大小的UIView,并将其添加为
navigationItem.titleView
,然后添加
navigationItem.titleView?.addSubview(imageView)
。由于某些原因,如果直接将UIImageView作为标题视图插入,则无法使用此选项。请注意,如果图像太大,则无法使用此选项。我有一个尺寸过大的图像,但这似乎不起作用,得到了一个较小的图像,然后这个解决方案开始起作用,直到你切换到另一个视图,然后返回到主视图。当您返回时,它会重置并再次偏离中心
navigationItem.titleView = imageView