导航栏和视图的整个图像

时间:2014-03-22 12:51:26

标签: ios ios7 background uinavigationbar

我希望将一个图像的rect(0,0,320,64)作为UINavigationController的UINavigationBar的背景,并将其余部分作为UIViewController视图的背景。 UINavigationController的UINavigationBar的背景不应该是透明的。 因此,当用户向上滚动视图时,它应该在UINavigationBar下。

我已通过以下方式解决了这个问题:

  • 在我的自定义UINavgationController类的初始化中:

    UIImage *backgroundTopRect = [UIImage imageNamed:@"backgroundTopRect"];
    [self.navigationBar setBackgroundImage:backgroundTopRect forBarMetrics:UIBarMetricsDefault];
    
    UIImage *backgroundRestRect = [UIImage imageNamed:@"backgroundRestRect"];
    [self.view setBackgroundColor:[UIColor colorWithPatternImage:backgroundRestRect]];
    
  • 在每个UIViewController类的viewDidLoad中:

    [self.view setBackgroundColor:[UIColor clearColor]];
    

在pushViewController的动画之后:动画:仅移动文本。例如,如果一个UIViewController包含多行UILabel并且其中一个包含多行UILabel,并且两者的背景都是透明的,则交叉溶解动画将仅适用于UILabels的文本。 看起来很糟糕。

所以我决定在

的帮助下替换默认动画
    -(id<UIViewControllerAnimatedTransitioning>) navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC

问题是我是对的吗?或者是否有另一种正确的方式来达到我想要的?

1 个答案:

答案 0 :(得分:1)

还有另一种标准动画解决方案:

    在我的自定义UINavgationController类的init中
  • 只设置了navigationBar的背景:

    UIImage *backgroundTopRect = [UIImage imageNamed:@"backgroundTopRect"];
    [self.navigationBar setBackgroundImage:backgroundTopRect forBarMetrics:UIBarMetricsDefault];
    
  • 在每个UIViewController类的viewDidLoad中:

    CGRect rect = [[UIScreen mainScreen] bounds];
    rect.origin.y -= NAVIGATION_BAR_HEIGHT; //=64
    UIView *imageView = [[UIView alloc] initWithFrame:rect]; //we should use UIView, which setBackgroundColor can reproduce image or make tiled image
    imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth; //it's needed if you change orientation
    [imageView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"Background"]]];
    [self.view addSubview:imageView];
    [self.view sendSubviewToBack:imageView];