通过自定义navigationBar setBackgroundImage查看偏移量

时间:2015-06-03 03:01:25

标签: ios objective-c uinavigationbar offset

我在iOS8中通过KVO设置自定义navigationBar,以及自定义navigationBar setBackgroundImage。

我发现viewContoller.view.frame.origin.y是64,而viewController是导航的rootViewController。

iOS 8中为什么viewContoller.view.frame.origin.y为64?

以下是演示代码:

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    UINavigationBar *temp = [[UINavigationBar alloc]init];
    [temp setBackgroundImage:[UIImage imageNamed:@"navbar_bg"] forBarMetrics:UIBarMetricsDefault];
    [self.navigationController setValue:temp forKey:@"navigationBar"];
}

- (void)viewDidAppear:(BOOL)animated
{

    NSLog(@"view : %@",self.view); // print :<UIView: 0x7ff8fa72cfa0; frame = (0 64; 375 603); autoresize = RM+BM; layer = <CALayer: 0x7ff8fa72b2b0>>
}

如果我取消[temp setBackgroundImage:[UIImage imageNamed:@"navbar_bg"] forBarMetrics:UIBarMetricsDefault];,则view.origin.y正确0

我应该正确设置自定义navigationBar哪个setBackgroundImage并保持self.view.orgin(0,0)

3 个答案:

答案 0 :(得分:1)

请检查图像资产。

资产中应存在图像“ navbar_bg @ 2x”,如果您在具有UIKit Scale factor 2.0的设备或模拟器上进行了测试,例如iPhone 8。

如果在iPhone 8 Plus上进行了测试,则资产中应存在图像“ navbar_bg @ 3x”。依此类推。

应该可以,根据Apple的演示代码Customizing Your App’s Navigation Bar


两种情况下,您的问题会发生。

  • 就我而言,将颜色转换为图像时不起作用。

首先,我认为这是图像尺寸问题。

根据调试视图层次结构,我得到BackgroundImageView的大小为414 X88。在iPhone XR的模拟器中进行了测试。

One

调试时,我认为图像应该小于imageView'size。 经过多次调整图像尺寸后仍然无法正常工作。

将颜色转换为图像的代码:

public static func color(_ color: UIColor, width w: CGFloat, height h: CGFloat) -> UIImage {

        let rect = CGRect(x: 0.0, y: 0.0, width: w, height: h)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, UIScreen.main.scale)
        let ctx = UIGraphicsGetCurrentContext()
        ctx?.setFillColor(color.cgColor)
        ctx?.fill(rect)
        var image = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        let imageData = UIImageJPEGRepresentation(image, 1.0)!
        image = UIImage(data: imageData)!
        return image
    }
  • 第二种情况:在具有UIKit比例因子2.0的iPhone XR模拟器中进行测试时,资产中不存在image @ 2x(“ navbar_bg @ 2x”)。

然后在我的实验中也不起作用。

答案 1 :(得分:0)

您可以设置navigationController.navigationItem的标题,而不是设置UINavigationBar并提供KVO。

- (void)viewDidLoad {

    [super viewDidLoad];

    UIImageView *img = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"navbar_bg"]];
    //Here you can create your own Custom View and provide as title of self.navigationController.navigationItem
    [self.navigationController.navigationItem setTitleView:img];
}

- (void)viewDidAppear:(BOOL)animated
{

    NSLog(@"view : %@",self.view); // print :<UIView: 0x79ea0a30; frame = (0 0; 375 603); autoresize = W+H; layer = <CALayer: 0x79ea0ac0>>
}

答案 2 :(得分:0)

我也做了一个实验。

我认为问题是由色彩空间引起的。

根据上述答案,我使用imageMagick创建了三张白色图像。

并在模拟器iPhone XR上使用白色image @ 2x。

问题也发生了。

Apple演示代码Customizing Your App’s Navigation Bar的示例图像是SRBG,我的彩色图像只是灰度。

我认为是不同的。

image

from image magick community

  

-colorspace更改图像在内存中的存储方式   设置的色彩空间仅设置图像的色彩空间而无需转换

     

许多图像格式(如JPG)不使用不同的色彩空间   无需花费一些时间的色彩配置文件,例如   转换回RGB色彩空间,除非已配置颜色配置文件   定义。

     

这就是为什么您看不到差异的原因。只有不同的IN   内存!

也许iOS对此做了一些优化。