我在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)
?
答案 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的模拟器中进行了测试。
调试时,我认为图像应该小于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
}
然后在我的实验中也不起作用。
答案 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,我的彩色图像只是灰度。
我认为是不同的。
-colorspace更改图像在内存中的存储方式 设置的色彩空间仅设置图像的色彩空间而无需转换
许多图像格式(如JPG)不使用不同的色彩空间 无需花费一些时间的色彩配置文件,例如 转换回RGB色彩空间,除非已配置颜色配置文件 定义。
这就是为什么您看不到差异的原因。只有不同的IN 内存!
也许iOS对此做了一些优化。