UINavigationBar 上的类别 - 仅适用于某些控制器

发布于 2024-11-16 04:54:18 字数 303 浏览 2 评论 0原文

我按照 UINavigationBar 问题的自定义背景

但是,我希望为我的一些控制器提供标准导航栏,但我不知道如何实现这一点。

如果我基于基于导航的应用程序模板启动一个新项目,并在单独的 .h 和 .m 文件中添加 UINavigationBar 类别,则立即应用该类别。没有包含或任何必要的内容。这是如何运作的?

感谢您的帮助!

I successfully implemented a navigation bar with custom background following the answer posted at Custom background for UINavigationBar problems.

However, I would like to have the standard navigation bar for some of my controllers and I have no clue how I can achieve this.

If I start a new project based on the Navigation-based Application template and just add the UINavigationBar category in separate .h and .m files, this category is applied immediately. No includes or whatever are necessary. How does this work?

Thanks for your help!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

断肠人 2024-11-23 04:54:18

这是一个快速技巧 - 使用导航栏的标签属性来打开自定义代码,即

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    if (tag < 500) {
        // Drawing code 
        UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);
    } else {
        // Do the default drawing
    }
}
@end

现在,标签少于 500 的导航控制器使用您的自定义背景。如果将标签设置为> 500,您将获得默认行为。


编辑

正如@MikeWeller正确指出的那样,我们无权访问drawRect的初始实现,我们的类别已经覆盖了它。

查看此链接以获取解决方案 - 基本上,它是您可以使用的宏可以包括这给你一个额外的方法:

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    if (tag < 500) {
        // Drawing code 
        UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);
    } else {
        // Do the default drawing
        invokeSupersequent(rect);
    }
}
@end

注意我自己没有尝试过,但之前使用过这个博客中的其他文章并取得了巨大的成功,所以我相信它:)让我们知道你的进展如何!

Here's a quick hack - use the tag property of your navigation bar to turn on the custom code i.e.

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    if (tag < 500) {
        // Drawing code 
        UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);
    } else {
        // Do the default drawing
    }
}
@end

Now, navigation controllers with a tag less than 500 use your custom background. If you set the tag to be > 500, you get the default behaviour.


EDIT

As @MikeWeller correctly pointed out, we don't have access to the initial implementation of drawRect, our category has overridden it.

Take a look at this link for a solution - basically, it's a macro that you can include that gives you an extra method :

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    if (tag < 500) {
        // Drawing code 
        UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);
    } else {
        // Do the default drawing
        invokeSupersequent(rect);
    }
}
@end

NB I haven't tried this myself but have used other articles from this blog before with great success so I trust it :) Let us know how you get on!

感情旳空白 2024-11-23 04:54:18
@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    if (tag < 500) {
        // Drawing code 
        UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);
    } else {
        // Do the default drawing
    }
}
@end

请记住,此方法在 iOS 5.0 中不起作用,因为苹果更改了 UINavigationBar 的实现,因此创建 UINavigationBar 的子类并重写其中的方法而不是创建类别。

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    if (tag < 500) {
        // Drawing code 
        UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);
    } else {
        // Do the default drawing
    }
}
@end

Remeber this method will not work in iOS 5.0 because apple has changed the implementation of UINavigationBar so instead create a subclass of UINavigationBar and override the method there instead of creating category.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文