UI基础xib的使用及xib的封装

一:

1、xib和stroryboard
Storyboard 描述软件界面,相对于xib比较重量级,一个stroryboard可以有多个场景。可以描述整个软件的所有界面
xib 描述软件界面,一般用来描述一个界面中的某一个部分

本质就是代码创建的

xib的加载过程,从xml中加载进来对界面的描述,并以此创建出来 JSAppView *view = [[JSAppView alloc] init];
View.frame = CGRectMake(0,0,85,90);

UIImageView *imageView = .......;
[view addSubView:imageView];

...............

xib和storyboard的共同点
都用来描述软件界面

都用Interface Builder工具来编辑
都使用xml来存储 对界面的描述

xib和storyboard的区别,查看xib和storyboard的xml代码发现他们的区别仅仅是xib少了

Scenes和viewController

xib是轻量级的,用来描述局部的UI界面
stroryboard是重量级的,用来描述整个软件的多个界面,并且能展示
多个界面之间的跳转关系

2:查看Xcode中storyBoard的xml展示文件

3 补充:、storyBoard或者xib中拖一个UIImageView 上不能拖其他控件到它上面

但是用代码的话,任何控件上都可以添加控件

按钮添加图片的两个特点

1),background 中的图片会填充整个按钮

2),image属性按照图片实际大小填充按钮

建议:小图片在按钮上设置用image属性

二:代码示例:

xib创建的view展示

// 通过xib创建view
        UIView *subView = [[[NSBundle mainBundle] loadNibNamed:@"LLAppInfoView" owner:nil options:nil] lastObject];

三,xib的封装代码

xib封装的view

#import <UIKit/UIKit.h>
@class LLAppInfo;
@interface LLAppInfoView : UIView

@property (nonatomic, strong) LLAppInfo *appInfo;

+ (instancetype)appInfoView;

@end
#import "LLAppInfoView.h"
#import "LLAppInfo.h"
@interface LLAppInfoView ()

@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@property (weak, nonatomic) IBOutlet UIButton *downView;
@property (weak, nonatomic) IBOutlet UILabel *nameView;
- (IBAction)downBtnClick:(UIButton *)sender;

@end

@implementation LLAppInfoView

+ (instancetype)appInfoView
{
    LLAppInfoView *subView = [[[NSBundle mainBundle] loadNibNamed:@"LLAppInfoView" owner:nil options:nil] lastObject];
    return subView;
}

- (void)setAppInfo:(LLAppInfo *)appInfo
{
    _appInfo = appInfo;

    self.iconView.image = [UIImage imageNamed:_appInfo.icon];
    self.nameView.text = _appInfo.name;
}

- (IBAction)downBtnClick:(UIButton *)sender {

    self.superview.userInteractionEnabled = NO;
    sender.enabled = NO;

    UILabel *textLab = [[UILabel alloc] init];

    [self.superview addSubview:textLab];
    textLab.text = [NSString stringWithFormat:@"%@ 正在下载", _appInfo.name];
    textLab.backgroundColor = [UIColor grayColor];
    textLab.alpha = 0;
    textLab.textAlignment = NSTextAlignmentCenter;
    CGFloat textLabW = 200;
    CGFloat textLabH = 30;
    CGFloat textLabX = (self.superview.frame.size.width -textLabW) * 0.5;
    CGFloat textLabY = (self.superview.frame.size.height - textLabH) * 0.5;

    textLab.frame = CGRectMake(textLabX, textLabY, textLabW, textLabH);
    textLab.layer.cornerRadius = 10;
    textLab.layer.masksToBounds = YES;
    [UIView animateWithDuration:1.0 animations:^{
        textLab.alpha = 0.9;

        [UIView animateWithDuration:1 delay:5 options:UIViewAnimationOptionAllowUserInteraction animations:^{

            textLab.alpha = 0;
        } completion:^(BOOL finished) {

            [textLab removeFromSuperview];
            self.superview.userInteractionEnabled = YES;

        }];
    }];
}
@end

数据模型

#import <Foundation/Foundation.h>

// 封装数据模型
@interface LLAppInfo : NSObject

/**
 图片
 */
@property (nonatomic, copy) NSString *icon;

/**
名称
 */

@property (nonatomic, copy) NSString *name;

#warning instancetype 和 id的区别
+ (instancetype)appInfoWithDic:(NSDictionary *)dic;
- (instancetype)initWithDic:(NSDictionary *)dic;

+ (NSArray *)array;

@end
#import "LLAppInfo.h"

@implementation LLAppInfo

- (instancetype)initWithDic:(NSDictionary *)dic
{
    if (self = [super init]) {
        self.name = dic[@"name"];
        self.icon = dic[@"icon"];
    }
    return self;
}

+ (instancetype)appInfoWithDic:(NSDictionary *)dic
{
    return [[self alloc] initWithDic:dic];
}

+ (NSArray *)array
{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil];

    NSArray *dicArray = [NSArray arrayWithContentsOfFile:path];

    NSMutableArray *appInfoM = [[NSMutableArray alloc] initWithCapacity:dicArray.count];

    for (NSDictionary *dic in dicArray) {

        [appInfoM addObject:[self appInfoWithDic:dic]];
    }

    return appInfoM;
}

@end

控制器

#import "ViewController.h"
#import "LLAppInfo.h"
#import "LLAppInfoView.h"

@interface ViewController ()
// 1,创建接受模型数据的数组
@property (nonatomic, strong) NSArray *appInfos;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    // 创建九宫格
    [self createView];

}

#pragma mark - 创建九宫格
- (void)createView
{
    // 1,
    // 1,1 列数
    int colnumCount = 3;
    CGFloat subViewWH= 100;
    CGFloat marginX = (self.view.frame.size.width - 3*subViewWH) / (colnumCount + 1);
    for (int i = 0; i<self.appInfos.count; i++) {

        // 计算行、列
        int row = i/colnumCount;
        int col = i%colnumCount;

        // 通过xib创建view
//        UIView *subView = [[[NSBundle mainBundle] loadNibNamed:@"LLAppInfoView" owner:nil options:nil] lastObject];

        // 通过xib封装的view创建view
        LLAppInfoView *subView = [LLAppInfoView appInfoView];

        [self.view addSubview:subView];

        // 确定subView的frame
        CGFloat subViewX = marginX + (marginX + subViewWH) * col;
        CGFloat subViewY = 30 + (marginX + subViewWH) * row;
        subView.frame = CGRectMake(subViewX, subViewY, subViewWH, subViewWH);
#warning 将子控件添加到一个定义的view中的好处

        LLAppInfo *appInfo = self.appInfos[i];
        subView.appInfo = appInfo;
        // 2,取子控件给子控件赋值(这里有两种方法)
        /**
            1,通过viewWithTag
            2,通过subViews
         */

        // 这样写还是有问题,如果有多个控件tag标记太多,而且tag的性能很差
        UIImageView *iconView = (UIImageView *)[subView viewWithTag:10];
        iconView.image = [UIImage imageNamed:appInfo.icon];

        UILabel *nameView =(UILabel *) [subView viewWithTag:20];
        nameView.text = appInfo.name;

    }
}

#pragma mark - 懒加载模型数据
- (NSArray *)appInfos
{
    if (!_appInfos) {
#warning NSBundle         //    NSLog(@"%@", NSHomeDirectory());

        // 1,重plist中读取数据
//        NSString *path = [[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil];
//        NSArray *appInfo = [NSArray arrayWithContentsOfFile:path];
//
//
//        _appInfos = appInfo;
//        NSLog(@"%@", _appInfos);

        // 直接从封装好的代码中取数据
        _appInfos = [LLAppInfo array];
    }
    return _appInfos;
}

@end

四:xib封装步骤

1)使用xib封装一个自定义view的步骤
1、新建一个继承UIView的自定义view,类名AppInfoView
2、创建xib(xib的名字和自定义view的名字一样AppInfoView),来描述AppInfoView的内部结构
3、修改xib中的UIView的类型改为AppInfoView
4、把xib中控件连线到AppInfoView
5、AppInfoView提供一个模型属性
6、重写模型的set方法,在set方法中给xib中对应的子控件赋值

2)封装的好处

xib中完成的代码 controller得知道xib中具体的控件,产生依赖 为了减少依赖,把xib内部控件的赋值给封装起来

如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部的子控件的创建屏蔽起来,不让外界关心,这样不 管view内部怎么变化外界都不需要知道

五:补充:

我们经常遇到程序报错直接跳到main函数中,如何解决这个问题可以设置断点看图:

时间: 2024-08-02 11:03:06

UI基础xib的使用及xib的封装的相关文章

ios开发-UI基础-应用管理(单纯界面)改进4-xib封装

[注意]转载请注明出处:吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/ 上篇文章结尾介绍了一下为什么要对xib进行封装,这里不再赘述. 大体整理了一下封装的思路(我自己的想法,可能不是很清晰): 为了扩展,将xib的代码封装,创建一个类,来描述xib >在新建的.m文件中,新建一个类扩展(类似于viewController) >在新建的.h文件中,加入一个模型的属性(@class) >在新建的.m文件中,重写模型的set方法(在.h文件中已经加入了,自动生

iOS开发UI基础—xib的简单使用

iOS开发UI基础-xib的简单使用 一.简单介绍 xib和stotyboard的比较,一个轻量级一个重量级. 二.xib的简单使用 1.建立xib文件 建立的xib文件命名为appxib.xib 2.对xib进行设置 根据程序的需要,这里把view调整为自由布局 建立view模型(设置长宽等参数) 调整布局和内部的控件 完成后的单个view 3.使用xib文件的代码示例 YYViewController.m文件代码如下: 1 // 2 // YYViewController.m 3 // 10

IOS开发UI篇--UITableView的自定义布局==xib布局

利用Xib进行实现 应用场景:像团购网站的列表数据显示,新闻列表显示等(由于该类的显示的数据单元格内容格式相同) (1)主控制器文件,在文件中实现了自己自定义的代理,加载数据, 1 #import "SLViewController.h" 2 #import "SLTgDatas.h" 3 #import "SLTableViewCell.h" 4 #import "SLFooterView.h" 5 #import &quo

[iOS基础控件 - 4.3] xib的使用

A.storyboard和xib 1.storyboard: 相对xib较重量级,控制整个应用的所有界面 2.xib: 轻量级,一般用来描述局部界面 B.使用 1.新建xib文件 New File ==> User Interface ==> Empty 2.打开新建的xib文件,出现可视化窗口 (1)拖入一个UIView (不是UIViewController) (2)设置大小:开启可自定义尺寸 ==> 定义尺寸 (3)拖入图标图片.名字.下载按钮,调整设置 3.在代码中获取xib中的

ios开发-UI基础-应用管理(单纯界面)

功能分析 以九宫格的形式展示应用信息 点击下载按钮后,做出相应操作(弹出一个提示"正在下载",相应应用的下载按钮变为"已下载") 步骤分析 搭建UI界面 加载应用信息 根据应用的个数创建对应的view 监听下载按钮的点击 应用截图: 这个小的综合实例涉及到的知识点: UIView的常见属性和方法 九宫格的计算方法 字典转模型 xib的使用 view的封装 简单的MVC 九宫格分析: 搭建九宫格的步骤 明确每一块用的是什么view 明确每个view之间的父子关系 先尝

ios开发-UI基础-应用管理(单纯界面)改进5-使用代理实现监听下载按钮的点击(delegate)

[注意]转载时请注明出处博客园-吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/ 前几篇文章介绍了一个应用管理的小应用,从最开始的单纯实现功能,一步一步就行改进\封装,上篇文章是使用xib进行了优化,本篇文章使用代理实现监听下载按钮的点击. 在原来的基础上,使用代理的主要思路分析: 首先要新建一个协议 声明协议的要实现的方法(一般为optional) 声明一个遵守该协议的代理的属性 使用代理,通知其代理完成操作 在代理中的实现步骤: 遵守协议 设置代理(一般通过拖线

IOS开发UI基础—在UIImageView中添加按钮以及Tag的参数说明

ios开发UI基础-在ImageView中添加按钮以及Tag的参数说明 一.tag参数 一个视图通常都只有一个父视图,多个子视图,在开发中可以通过使用子视图的tag来取出对应的子视图.方法为Viewwithtag: 提示点:在xib中如果想要通过tag参数获取对应的控件(属性),不要把tag的参数设置为0,因为xib中所有的对象默认tag都为0,设置为0取不到对象. 二.ImageView中添加按钮(1)ImageView和Button的比较 Button按钮的内部可以放置多张图片(4),而Im

iOS开发UI基础—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

ios开发UI基础-使用纯代码自定义UItableviewcell实现一个简单的微博界面布局 一.实现效果 二.使用纯代码自定义一个tableview的步骤 1.新建一个继承自UITableViewCell的类 2.重写initWithStyle:reuseIdentifier:方法 添加所有需要显示的子控件(不需要设置子控件的数据和frame,  子控件要添加到contentView中) 进行子控件一次性的属性设置(有些属性只需要设置一次, 比如字体\固定的图片) 3.提供2个模型 数据模型:

iOS开发UI基础—从代码的逐步优化看MVC

iOS开发UI基础-从代码的逐步优化看MVC 一.要求 要求完成下面一个小的应用程序. 二.一步步对代码进行优化 注意:在开发过程中,优化的过程是一步一步进行的.(如果一个人要吃五个包子才能吃饱,那么他是否直接吃第五个,前面四个不用吃就饱了?) 1.完成基本要求的代码(使用了字典转模型和xib连线) (1)文件结构 (2)主要代码 字典转模型部分: YYappInfo.h头文件 1 // 2 // YYappInfo.h 3 // 12-视图改进(1) 4 // 5 // Created by

ios开发-UI基础-应用管理(单纯界面)改进2

本篇文章,通过字典转模型来改进上篇文章中的代码. 字典转模型,之前的文章已经介绍过,这里再重复一下:  字典转模型 字典:用来存储数据的,用键值对存储数据,是一个nsdictionary ,(不好处:key值容易写错) 模型: 用来存储数据的,一个字典对应一个模型,模型用属性来存储数据,是一个纯洁的object对象 @property(nonatomic,copy)NSString *name; @property(nonatomic,copy)NSString *icon; 字典转模型:一个字