【问题标题】:How to change UINavigationBar background with image on some views but not all?如何在某些视图上使用图像更改 UINavigationBar 背景,但不是全部?
【发布时间】:2011-12-17 07:35:42
【问题描述】:

我想将图像设置为 UINavigationController 背景,但我发现的大多数解决方案都在导航栏中为应用程序中的所有视图应用背景。你能提供一些可能有帮助的代码吗?

感谢您的帮助,

斯蒂芬

【问题讨论】:

    标签: iphone ios ios4 uinavigationcontroller uinavigationbar


    【解决方案1】:

    嗨,斯蒂芬妮·库阿库,

    试试这个,它的作品...

     UIImageView *bgNavigation= [[UIImageView alloc] initWithImage:[UIImage imageNamed: @"bgNav.png"]];    
        self.navigationItem.titleView = bgNavigation;    
        [bgNavigation release];
    

    尤其是View的willAppear方法

    【讨论】:

    • titleView 不适用于背景。
    • 我的意思是背景不是titleView :)
    【解决方案2】:

    这是我在一个项目中使用的一种快速而肮脏的方式(我不需要支持横向)。我用UINavigationBar 的类别实现了它,方法是调配。适用于 iOS 4 和 5(我没有在 iOS 3 上尝试过)。

    UINavigationBar+SYCustomBackground.h

    #import <UIKit/UIKit.h>
    
    @interface UINavigationBar (SYCustomBackground)
    @property (nonatomic,retain) UIImage *sy_customBackgroundImage;
    @end
    

    UINavigationBar+SYCustomBackground.m

    #import "UINavigationBar+SYCustomBackground.h"
    #import <objc/runtime.h>
    
    @implementation UINavigationBar (SYCustomBackground)
    
    static char BACKGROUND_IMAGE_KEY;
    static BOOL drawRectsSwizzled = NO;
    
    // Swizzles drawRect: and sy_drawRect:
    - (void)swizzleDrawRectIfNecessary
    {
        if (!drawRectsSwizzled) {
            Method origMethod = class_getInstanceMethod([self class], @selector(drawRect:));
            Method myMethod = class_getInstanceMethod([self class], @selector(sy_drawRect:));
            method_exchangeImplementations(origMethod, myMethod);
            drawRectsSwizzled = YES;
        }
    }
    
    - (void)setSy_customBackgroundImage:(UIImage *)image
    {
        // iOS 5
        if ([self respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) {
            [self setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
        }
        // iOS < 5
        else {
            [self swizzleDrawRectIfNecessary];
            objc_setAssociatedObject(self, &BACKGROUND_IMAGE_KEY, image, OBJC_ASSOCIATION_RETAIN);
        }
    }
    
    - (UIImage *)sy_customBackgroundImage
    {
        // iOS 5
        if ([self respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) {
            return [self backgroundImageForBarMetrics:UIBarMetricsDefault];
        }
        // iOS < 5
        else {
            [self swizzleDrawRectIfNecessary];
            return objc_getAssociatedObject(self, &BACKGROUND_IMAGE_KEY);
        }
    }
    
    - (void)sy_drawRect:(CGRect)rect
    {
        UIImage *backgroundImage = self.sy_customBackgroundImage;
    
        if (backgroundImage) {
            [backgroundImage drawInRect:rect];
        }
        else {
            // No custom image, calling original drawRect:
            // Note: it’s swizzled, so we must call sy_drawRect:
            [self sy_drawRect:rect];
        }
    }
    
    @end
    

    然后,如果您想在一张UINavigationController 中更改图像,则将背景图像设置在viewWillAppear 并在viewWillDisappear 中恢复它们。

    它并不完美,我会添加一些淡入淡出过渡,为背景添加推送/弹出,但我还没有时间,所以请随时改进它。

    【讨论】:

      【解决方案3】:

      显然,您已经知道如何将图像设置为导航栏的背景。

      如果您需要区分各种视图控制器,则需要更改应该表现不同的一个视图控制器的viewWillAppearviewWillDisappear 中的栏。你明白了。

      【讨论】:

        【解决方案4】:

        这是为导航控制器设置背景图像的正确方法。这在 ios 5 中可用。

        [navBar setBackgroundImage:[UIImage imageNamed: @"image.png"] forBarMetrics:UIBarMetricsDefault];
        

        【讨论】:

        • 如果您只想更改单个 uiview 背景,这可能不起作用。它适用于导航控制器的所有uiview。
        • 是的,这可能是大多数人的问题的解决方案,但此功能无法“取消设置”背景。
        【解决方案5】:

        我相信这是 iOS5 的第一个实际答案,主要问题是完成后“删除”背景图像。好吧,只保留现有的。

        @implementation MyViewController {
            UIImage *_defaultImage;
        }
        
        - (void)viewWillAppear:(BOOL)animated {   
            _defaultImage = [self.navigationController.navigationBar backgroundImageForBarMetrics:UIBarMetricsDefault];
            [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"bar.png"] forBarMetrics:UIBarMetricsDefault];
        }
        
        - (void)viewWillDisappear:(BOOL)animated {
            [self.navigationController.navigationBar setBackgroundImage:_defaultImage forBarMetrics:UIBarMetricsDefault];
        }
        

        【讨论】:

          猜你喜欢
          • 2011-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多