Allen Woody

如果你像程序员一样工作,你就是程序员。如果你像架构师一样工作,你就是架构师。

嗨,我是朱洪伍 (@hnxyzhw),一名 iOS 开发者。现居北京,就职于中化能源科技有限公司。正在get新技能,探求创意之源。


我在简书上创建的有关于iOS开发的技术专辑,欢迎各位前来了解!

#文章内容

title和leftBarButtonItem不显示

之前自定义了navigationBar的背景颜色,升级到iOS10后,发现title,跟leftBarButtonItem不显示。 iOS9 之前的navigationBar的背景是_UINavigationBarBackground,到iOS变成了_UIBarBackground,可以通过xcode查看一下相应的布局。我的解决办法是,分别判断iOS10,iOS9的版本,找到对应的背景图,将起隐藏掉,可以消除分割线。然后重新创建一个视图层,颜色可以自定义,需要注意在添加视图或者更新视图时要放到主线程里,同时这个方法需要在viewWillAppear里调用。

#define isIOS9 ([[UIDevice currentDevice].systemVersion intValue]>=9?YES:NO)
#define isIOS10 ([[UIDevice currentDevice].systemVersion intValue]>=10?YES:NO)
#pragma mark - 动态修改状态栏跟顶部导航栏的颜色
-(void)changeNavigationBarBackgroundColor:(UIColor *)barBackgroundColor{
    if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]){
        NSArray *subviews =self.navigationController.navigationBar.subviews;
        for (id viewObj in subviews) {
            if (isIOS10) {
                //iOS10,改变了状态栏的类为_UIBarBackground
                NSString *classStr = [NSString stringWithUTF8String:object_getClassName(viewObj)];
                if ([classStr isEqualToString:@"_UIBarBackground"]) {
                    UIImageView *imageView=(UIImageView *)viewObj;
                    imageView.hidden=YES;
                }
            }else{
                //iOS9以及iOS9之前使用的是_UINavigationBarBackground
                NSString *classStr = [NSString stringWithUTF8String:object_getClassName(viewObj)];
                if ([classStr isEqualToString:@"_UINavigationBarBackground"]) {
                    UIImageView *imageView=(UIImageView *)viewObj;
                    imageView.hidden=YES;
                }
            }
        }
        UIImageView *imageView = [self.navigationController.navigationBar viewWithTag:111];
        if (!imageView) {
            imageView=[[UIImageView alloc] initWithFrame:CGRectMake(0, -20, self.view.width, 64)];
            imageView.tag = 111;
            [imageView setBackgroundColor:barBackgroundColor];
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.navigationController.navigationBar insertSubview:imageView atIndex:0];
            });
        }else{
            [imageView setBackgroundColor:barBackgroundColor];
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.navigationController.navigationBar sendSubviewToBack:imageView];
            });
            
        }
        
    }
}
上一篇文章

iOS自定义debug模式下的NSLog宏输出

在debug模式下的时候需要把所在的类名、方法名、行数等相关信息也打印出来,这样在开发的时候就可以快速定位调试的位置,以及当前的调试信息。对于解决bug来说,这是一个非常有效率的方法。同时在发布模式下,我们可以不输出打印这些数据,不会造成冗余数据的产生。先介绍一些参数:(1) __VA_ARGS__是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起...…

继续阅读
下一篇文章

iOS中NSString的strong、copy的使用

       iOS开发中关于内存的管理有两种,一种是基于ARC(Automatic Reference Counting)环境下的,另一种是MRC(Mannul Reference Counting)。这两种模式可以在工程中的Build Settings选项下设置,可参照下图所示:**       说明:设置为Yes是ARC环境下,设置为NO是MRC环境下。**       进入正题,我们在声明一个NSString类型的属性时,会遇到这样的一个问题。就是应该使用strong呢?还是应该用...…

继续阅读