Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 根据横向/纵向更改UINavigationBar背景?_Ios_Uinavigationcontroller_Uinavigationbar_Landscape_Portrait - Fatal编程技术网

Ios 根据横向/纵向更改UINavigationBar背景?

Ios 根据横向/纵向更改UINavigationBar背景?,ios,uinavigationcontroller,uinavigationbar,landscape,portrait,Ios,Uinavigationcontroller,Uinavigationbar,Landscape,Portrait,我希望我的UINavigationBar在SignatureView控制器内正确旋转。这是当前旋转时在纵向与景观模式下的外观: 正如您所看到的,当处于横向时,UINavigationBar不会在宽度上缩放。我的项目构建如下: rootViewControllerUINavgationController---模式推送--->签名视图控制器 请注意,我不是使用普通推送到SignatureViewController,而是使用模式推送。以防万一,我想提及这一点,因为我不确定它是否会以任何奇怪的方式影

我希望我的UINavigationBar在SignatureView控制器内正确旋转。这是当前旋转时在纵向与景观模式下的外观:

正如您所看到的,当处于横向时,UINavigationBar不会在宽度上缩放。我的项目构建如下:

rootViewControllerUINavgationController---模式推送--->签名视图控制器

请注意,我不是使用普通推送到SignatureViewController,而是使用模式推送。以防万一,我想提及这一点,因为我不确定它是否会以任何奇怪的方式影响结果?。。。我尝试了不同的方法来改变导航栏的背景,这取决于它是横向的还是纵向的。我将在下面发布一些:

试试nr1:不工作

- (void) viewWillAppear:(BOOL)animated {

[[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"bar_nav_black.png"] forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"navbar25g.png"]  forBarMetrics:UIBarMetricsLandscapePhone];

[[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
}
- (void) viewWillAppear:(BOOL)animated {

 UIImage *navBarLandscape =  [[UIImage imageNamed:@"navbar25g.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(x,x,x,x)];

 [[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"bar_nav_black.png"] forBarMetrics:UIBarMetricsDefault];
 [[UINavigationBar appearance]setBackgroundImage:navBarLandscape  forBarMetrics:UIBarMetricsDefault];

 [[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth];

}
- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification
{

UIView *v =  [[UIView alloc]init];

int a = [[notification.userInfo objectForKey: UIApplicationStatusBarOrientationUserInfoKey] intValue];
int w = [[UIScreen mainScreen] bounds].size.width;
int h = [[UIScreen mainScreen] bounds].size.height;
switch(a){
    case 4:
        v.frame =  CGRectMake(0,20,w,h);
        [[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"bar_nav_black.png"] forBarMetrics:UIBarMetricsDefault];//Have also tried with UIBarMetricsLandscapePhone...
        NSLog(@"willrotate:1");

        break;
    case 3:
        v.frame =  CGRectMake(-20,0,w-20,h+20);
        [[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"navbar25g.png"] forBarMetrics:UIBarMetricsDefault];//Have also tried with UIBarMetricsLandscapePhone...
        NSLog(@"willrotate:2");
         [self.view addSubview:v];
        break;
    case 2:
        v.frame =  CGRectMake(0,-20,w,h);
        [[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"bar_nav_black.png"] forBarMetrics:UIBarMetricsDefault];//Have also tried with UIBarMetricsLandscapePhone...
        NSLog(@"willrotate:3");

        break;
    case 1:
        v.frame =  CGRectMake(20,0,w-20,h+20);
        NSLog(@"willrotate:4");
        [[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"navbar25g.png"]  forBarMetrics:UIBarMetricsDefault];//Have also tried with UIBarMetricsLandscapePhone...


}
试试nr2:不工作

- (void) viewWillAppear:(BOOL)animated {

[[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"bar_nav_black.png"] forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"navbar25g.png"]  forBarMetrics:UIBarMetricsLandscapePhone];

[[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
}
- (void) viewWillAppear:(BOOL)animated {

 UIImage *navBarLandscape =  [[UIImage imageNamed:@"navbar25g.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(x,x,x,x)];

 [[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"bar_nav_black.png"] forBarMetrics:UIBarMetricsDefault];
 [[UINavigationBar appearance]setBackgroundImage:navBarLandscape  forBarMetrics:UIBarMetricsDefault];

 [[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth];

}
- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification
{

UIView *v =  [[UIView alloc]init];

int a = [[notification.userInfo objectForKey: UIApplicationStatusBarOrientationUserInfoKey] intValue];
int w = [[UIScreen mainScreen] bounds].size.width;
int h = [[UIScreen mainScreen] bounds].size.height;
switch(a){
    case 4:
        v.frame =  CGRectMake(0,20,w,h);
        [[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"bar_nav_black.png"] forBarMetrics:UIBarMetricsDefault];//Have also tried with UIBarMetricsLandscapePhone...
        NSLog(@"willrotate:1");

        break;
    case 3:
        v.frame =  CGRectMake(-20,0,w-20,h+20);
        [[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"navbar25g.png"] forBarMetrics:UIBarMetricsDefault];//Have also tried with UIBarMetricsLandscapePhone...
        NSLog(@"willrotate:2");
         [self.view addSubview:v];
        break;
    case 2:
        v.frame =  CGRectMake(0,-20,w,h);
        [[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"bar_nav_black.png"] forBarMetrics:UIBarMetricsDefault];//Have also tried with UIBarMetricsLandscapePhone...
        NSLog(@"willrotate:3");

        break;
    case 1:
        v.frame =  CGRectMake(20,0,w-20,h+20);
        NSLog(@"willrotate:4");
        [[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"navbar25g.png"]  forBarMetrics:UIBarMetricsDefault];//Have also tried with UIBarMetricsLandscapePhone...


}
试试nr3:不工作

- (void) viewWillAppear:(BOOL)animated {

[[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"bar_nav_black.png"] forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"navbar25g.png"]  forBarMetrics:UIBarMetricsLandscapePhone];

[[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
}
- (void) viewWillAppear:(BOOL)animated {

 UIImage *navBarLandscape =  [[UIImage imageNamed:@"navbar25g.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(x,x,x,x)];

 [[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"bar_nav_black.png"] forBarMetrics:UIBarMetricsDefault];
 [[UINavigationBar appearance]setBackgroundImage:navBarLandscape  forBarMetrics:UIBarMetricsDefault];

 [[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth];

}
- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification
{

UIView *v =  [[UIView alloc]init];

int a = [[notification.userInfo objectForKey: UIApplicationStatusBarOrientationUserInfoKey] intValue];
int w = [[UIScreen mainScreen] bounds].size.width;
int h = [[UIScreen mainScreen] bounds].size.height;
switch(a){
    case 4:
        v.frame =  CGRectMake(0,20,w,h);
        [[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"bar_nav_black.png"] forBarMetrics:UIBarMetricsDefault];//Have also tried with UIBarMetricsLandscapePhone...
        NSLog(@"willrotate:1");

        break;
    case 3:
        v.frame =  CGRectMake(-20,0,w-20,h+20);
        [[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"navbar25g.png"] forBarMetrics:UIBarMetricsDefault];//Have also tried with UIBarMetricsLandscapePhone...
        NSLog(@"willrotate:2");
         [self.view addSubview:v];
        break;
    case 2:
        v.frame =  CGRectMake(0,-20,w,h);
        [[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"bar_nav_black.png"] forBarMetrics:UIBarMetricsDefault];//Have also tried with UIBarMetricsLandscapePhone...
        NSLog(@"willrotate:3");

        break;
    case 1:
        v.frame =  CGRectMake(20,0,w-20,h+20);
        NSLog(@"willrotate:4");
        [[UINavigationBar appearance]setBackgroundImage:[UIImage imageNamed:@"navbar25g.png"]  forBarMetrics:UIBarMetricsDefault];//Have also tried with UIBarMetricsLandscapePhone...


}

请注意,在try nr3中,NSLog可以工作,但它拒绝更改UINavigationBar的背景。那么,你知道我接下来要做什么吗?/关于

您能否尝试实现UINavigationBar类并重写一个drawRect:方法

应该行得通

@implementation UINavigationBar (BackgroundImage)

- (void)drawRect:(CGRect)rect 
{
    UIImage *navimage;
    //we will check if screen width is 320 then it will be potrait
    if(self.frame.size.width == 320) 
    {
        navimage = [UIImage imageNamed: @"Your Potrait nav bar image"];
    }
    else
    {
        navimage = [UIImage imageNamed: @"Your Landscape nav bar image"];
    }

    [navimage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

@end
希望对你有帮助

在nr1和nr2上试试这个

只要用这个改变最后一行代码..如果它工作或不工作…让我知道

self.navigationController.navigationBar.autoresizingMask = UIViewAutoresizingFlexibleTopMargin; //UIViewAutoresizingFlexibleWidth