文档章节

基础类BaseViewController

 泊竹
发布于 2013/12/12 12:34
字数 516
阅读 1334
收藏 1

   这个类比较适合纯代码开发项目,它的内部有两个公共属性,都是 UIView。一个作为自定义导航栏的superView,另作为除导航栏外的其他界面元素的superView。

   它会自动监测当前设备是什么IOS版本,设备的屏幕尺寸是多少。因为用到了autolayout,所以自动适配屏幕旋转。

具体代码如下:

#import <UIKit/UIKit.h>

@interface BaseViewController : UIViewController

@property (nonatomic, strong) UIView *navigationBarView;
@property (nonatomic, strong) UIView *backgroundView;

- (id)initWithBarHeight:(CGFloat)barHeight;

- (CGRect)getBaseNavigationBarFrame;
- (CGRect)getBaseBackgroundViewFrame;

@end

#import "BaseViewController.h"

@interface BaseViewController ()

@property (nonatomic, assign) CGFloat barHight;

@property (nonatomic, assign) CGRect navigationBarFrame;
@property (nonatomic, assign) CGRect backgroundViewFrame;

@end

@implementation BaseViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (id)initWithBarHeight:(CGFloat)barHeight
{
    self = [super initWithNibName:nil bundle:nil];
    if (self) {
        
        self.barHight = barHeight;
    }
    
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
	//导航条View
    self.navigationBarView = [[UIView alloc] init];
    self.navigationBarView.backgroundColor = [UIColor clearColor];
    
    //除导航条外的背景View
    self.backgroundView = [[UIView alloc] init];
    self.backgroundView.backgroundColor = [UIColor clearColor];
    self.backgroundView.clipsToBounds = NO;
    [self.view addSubview:self.backgroundView];
    [self.view addSubview:self.navigationBarView];
    
    self.navigationBarFrame = self.view.bounds;
    self.backgroundViewFrame = self.view.bounds;

    if ([UIApplication sharedApplication].statusBarHidden == YES) {
        
        [self statusBarIsHidden];
        
    }else {
        
        [self statusBarIsShow];
    }
}

- (void)statusBarIsHidden
{
    [self autoLayoutWithV6Height:self.barHight V7Height:self.barHight];
}

- (void)statusBarIsShow
{
    [self autoLayoutWithV6Height:self.barHight V7Height:self.barHight + 20];
}

- (void)autoLayoutWithV6Height:(CGFloat)v6Height V7Height:(CGFloat)v7Height
{
    if ([self.view respondsToSelector:@selector(addConstraints:)]) {
        
        [self.navigationBarView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [self.backgroundView setTranslatesAutoresizingMaskIntoConstraints:NO];
        
        UIView *navigationBarView = self.navigationBarView;
        UIView *backgroundView = self.backgroundView;
        
        CGRect tmpNavigationBarFrame = self.navigationBarFrame;
        CGRect tmpBackgroundViewFrame = self.backgroundViewFrame;
        
        //横向自动布局
        NSArray *layoutConstraints1 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[navigationBarView]-0-|" options:0 metrics:nil views:@{@"navigationBarView":navigationBarView}];
        
        [self.view addConstraints:layoutConstraints1];
        
        NSArray *layoutConstraints2 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[backgroundView]-0-|" options:0 metrics:nil views:@{@"backgroundView":backgroundView}];
        
        [self.view addConstraints:layoutConstraints2];
        
        //纵向自动布局
        NSArray *layoutConstraints3 = nil;
        
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
            
            NSString *formatString = [NSString stringWithFormat:@"V:|-0-[navigationBarView(==%f)]-0-[backgroundView]-0-|", v7Height];
            
            layoutConstraints3 = [NSLayoutConstraint constraintsWithVisualFormat:formatString options:0 metrics:nil views:@{@"navigationBarView":navigationBarView, @"backgroundView":backgroundView}];
            
            tmpNavigationBarFrame.size.height = v7Height;
            tmpBackgroundViewFrame.size.height = self.view.frame.size.height - v7Height;
            tmpBackgroundViewFrame.origin.y = v7Height;
            
        }else {
            
            NSString *formatString = [NSString stringWithFormat:@"V:|-0-[navigationBarView(==%f)]-0-[backgroundView]-0-|", v6Height];
            
            layoutConstraints3 = [NSLayoutConstraint constraintsWithVisualFormat:formatString options:0 metrics:nil views:@{@"navigationBarView":navigationBarView, @"backgroundView":backgroundView}];
            
            tmpNavigationBarFrame.size.height = v6Height;
            tmpBackgroundViewFrame.size.height = self.view.frame.size.height - v6Height;
            tmpBackgroundViewFrame.origin.y = v6Height;
        }
        
        [self.view addConstraints:layoutConstraints3];
        
        self.navigationBarFrame = tmpNavigationBarFrame;
        self.backgroundViewFrame = tmpBackgroundViewFrame;
        
    }else {
        
        //Autoresizing代码
        CGRect frame = [UIScreen mainScreen].bounds;
        
        self.navigationBarView.frame = CGRectMake(0, 0, frame.size.width, v6Height);
        self.navigationBarView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleWidth;
        
        self.backgroundView.frame = CGRectMake(0, v6Height, frame.size.width, frame.size.height - v6Height);
        
        self.navigationBarFrame = self.navigationBarView.frame;
        self.backgroundViewFrame = self.backgroundView.frame;
    }
}

- (CGRect)getBaseNavigationBarFrame
{
    return self.navigationBarFrame;
}

- (CGRect)getBaseBackgroundViewFrame
{
    return self.backgroundViewFrame;
}

@end


© 著作权归作者所有

粉丝 90
博文 67
码字总数 13285
作品 0
徐汇
私信 提问
加载中

评论(2)

快乐赤子心
俊哥,我的代码老蹦到这:NSArray *layoutConstraints2 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[backgroundView]-0-|" options:0 metrics:nil views:@{@"backgroundView":backgroundView}];
快乐赤子心
是不是以后项目只要是viewcontroll 都可以继承这个类啊?6
关于目前自己iOS项目使用的第三方开源库

1.AFNetworking   目前比较推荐的iOS网络请求组件,默认网络请求是异步,通过block回调的方式对返回数据进行处理。 2.FMDB   对sqlite数据库操作进行了封装,demo也比较简单。 3.MBProg...

-Man
2015/12/01
44
0
iOS项目架构 - 模块化

iOS项目架构 - 模块化 当我们谈论iOS架构的时候我们在谈论什么 模块化 规范化 统一行为 本文主要就以上模块化,以网络请求模块的抽取为例稍作讨论。 模块化 模块化的目的是实现解耦,提升模块...

我是IT码农
2016/03/29
432
0
iOS项目开发框架“完全体”(三)-- 奥义“手里剑”

本个章节进行BaseViewController的讲解,并放出部分源码哦 首先我们在开发一个项目搭建基类框架的时候,BaseViewController是一个非常重要的环节,后面涉及到继承,重写等各种问题,我们该考...

Suneday
2017/11/30
0
0
iOS-PingFangSC字体

1.iOS9.0以后系统自带了平方字体PingFangSC,但是在iOS9.0以前,是没有平方字体PingFangSC的,如果我们想用平方字体,在iOS9.0以上是好的,但是在低于9.0的系统上是找不到这个字体的,例如:...

北方人在上海
2016/08/05
699
0
【类别高级使用】Categories

工程添加类别 扩展方法 扩展属性

创意总监
2016/09/13
5
0

没有更多内容

加载失败,请刷新页面

加载更多

对集合的理解

开端 同事小G提了一点,Set都是无序的,但是我之前有看到过treeSet是有序的,就和他讨论了起来,还百度了一下,有序。然而他只是淡淡的说自己敲代码验证一下。 TreeSet 循环int类型 1~20,毫...

无极之岚
31分钟前
0
0
Kernel字符设备驱动框架

Linux设备分为三大类:字符设备,块设备和网络设备,这三种设备基于不同的设备框架。相较于块设备和网络设备,字符设备在kernel中是最简单的,也是唯一没有基于设备基础框架(device结构)的...

yepanl
35分钟前
0
0
Ajax

定义 Ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术,用于创建动态网页 Ajax=Asynchronous Javascript And XML(异步的JavaScript和XML) 原理 XMLHttpRequest对象(异...

星闪海洋
昨天
2
0
Jenkins 中文本地化的重大进展

本文首发于:Jenkins 中文社区 我从2017年开始,参与 Jenkins 社区贡献。作为一名新成员,翻译可能是帮助社区项目最简单的方法。 本地化的优化通常是较小的改动,你无需了解项目完整的上下文...

Jenkins中文社区
昨天
3
0
Spring中如何使用设计模式

关于设计模式,如果使用得当,将会使我们的代码更加简洁,并且更具扩展性。本文主要讲解Spring中如何使用策略模式,工厂方法模式以及Builder模式。 1. 策略模式 关于策略模式的使用方式,在S...

爱宝贝丶
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部