iOS-简单两步搞定自定义View
2019-12-04 本文已影响0人
晴天ccc
目录
- 前言
- 【一】纯代码自定义View
---- 基本用法
---- 使用构造方法传入外部数据- 【二】XIB自定义View
---- 基本用法
---- 模拟简单弹框VIew使用案例
前言
相信大家对于自定义View并不陌生,很多业务上面都会遇到,今天做了个总结,三步骤搞定自定义VIew,分类纯代码和Xib布局的方式。
【一】纯代码自定义View
基本用法
- 新建
OC
文件MyCodeCustomView.h
,MyCodeCustomView.m
- 在
initWithFrame:
方法中将子控件添加到View
中。 - 在
layoutSubviews
设置内部控件的frame
。 - 添加相关逻辑方法,在控制器中进行调用。
在MyCodeCustomView.h
中:
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface MyCodeCustomView : UIView
// 显示View
- (void)showPopView;
// 隐藏View
- (void)dismissPopView;
// Block点击事件回调处理
@property (copy,nonatomic) void (^submitBtnClickBlock)(UIView * view, NSString * keyStr);
@end
NS_ASSUME_NONNULL_END
在MyCodeCustomView.m
中:
#import "MyCodeCustomView.h"
@interface MyCodeCustomView ()
@property (nonatomic, weak) UILabel *nameLab;
@property (nonatomic, weak) UIImageView *headImgVIew;
@property (nonatomic, weak) UIButton *submitBtn;
@end
@implementation MyCodeCustomView
#pragma mark - 原始初始化方法
// 1、首先调用init方法
- (instancetype)init{
if (self = [super init]) {
[self setUp];
}
return self;
}
// 2、然后调用initWithFrame方法
- (instancetype)initWithFrame:(CGRect)frame{
if (self =[super initWithFrame:frame]) {
[self setUp];
}
return self;
}
#pragma mark - UI布局
// 初始化UI控件
- (void)setUp{
UILabel *nameLab = [[UILabel alloc] init];
nameLab.backgroundColor = [UIColor yellowColor];
nameLab.textAlignment = NSTextAlignmentCenter;
[self addSubview:nameLab];
_nameLab = nameLab;
UIImageView *headImgVIew = [[UIImageView alloc] init];
headImgVIew.backgroundColor = [UIColor redColor];
[self addSubview:headImgVIew];
_headImgVIew = headImgVIew;
UIButton *submitBtn = [[UIButton alloc] init];
submitBtn.backgroundColor = [UIColor blueColor];
[submitBtn addTarget:self action:@selector(submitAction) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:submitBtn];
_submitBtn = submitBtn;
}
// 设置UI控件的frame
- (void)layoutSubviews{
[super layoutSubviews];
// 1.获取当前控件的尺寸
CGFloat width = self.frame.size.width;
CGFloat height = self.frame.size.height;
// 2.设置子控件的frame
self.nameLab.frame = CGRectMake(0, 0, width, 50);
self.headImgVIew.frame = CGRectMake(0, 50, 100, 100);
self.submitBtn.frame = CGRectMake(0, 150, width, height-450);
}
// 点击事件处理
- (void)submitAction {
// 根据自己业务处理TODO
NSLog(@"hello world !");
[self dismissPopView];
// Block点击事件回调处理
if (self.submitBtnClickBlock) {
self.submitBtnClickBlock(self, @"hello world");
}
}
#pragma mark - 视图显示/隐藏控制
// 显示View
- (void)showPopView{
[[[UIApplication sharedApplication] windows].firstObject addSubview:self];
}
// 隐藏View
- (void)dismissPopView{
[self removeFromSuperview];
}
@end
在MainViewCtl.h
中:
#import "MainViewCtl.h"
#import "MyCodeCustomView.h"
@interface MainViewCtl ()
@property (strong,nonatomic) MyCodeCustomView * codeCustomView;
@end
@implementation MainViewCtl
- (void)viewDidLoad {
[super viewDidLoad];
// 在合适的时候先显示View
[self.codeCustomView showPopView];
// 在合适的时候先隐藏View
[self.codeCustomView dismissPopView];
}
#pragma mark - 懒加载
- (MyCodeCustomView *)codeCustomView{
if (!_codeCustomView) {
_codeCustomView = [[MyCodeCustomView alloc] initWithFrame:CGRectMake(0, 0, 300, 500)];
_codeCustomView.frame = CGRectMake(0, 0, 300, 500);
// View点击方法回调处理
_codeCustomView.submitBtnClickBlock = ^(UIView * _Nonnull view, NSString * _Nonnull keyStr) {
// TODO
};
}
return _codeCustomView;
}
@end
使用构造方法传入外部数据
在MyCodeCustomView.h
中增加:
// 构造方法
- (instancetype)initWithData:(NSDictionary *)dataDict;
// 外部数据
@property (nonatomic,strong) NSDictionary *dataDict;
在MyCodeCustomView.m
中增加:
#pragma mark - 自定义初始化方法
// 对象方法
- (instancetype)initWithData:(NSDictionary *)dataDict{
if (self = [super init]) {
// 注意:先创建后赋值
[self setUp];
self.dataDict = dataDict;
}
return self;
}
#pragma mark - 数据相关
// 数据Setter方法,外部传入数据就会调用该方法
- (void)setDataDict:(NSDictionary *)dataDict{
_dataDict = dataDict;
self.nameLab.text = dataDict[@"realName"];
}
在MyCodeCustomView.h
中:
@implementation MainViewCtl
- (void)viewDidLoad {
[super viewDidLoad];
// 在合适的时候先显示View
[self.codeCustomView showPopView];
// 在合适的时候先隐藏View
[self.codeCustomView dismissPopView];
// 在合适的时候调整数据
self.codeCustomView.dataDict = @{@"realName":@"李四"};
}
#pragma mark - 懒加载
- (MyCodeCustomView *)codeCustomView{
if (!_codeCustomView) {
_codeCustomView = [[MyCodeCustomView alloc] initWithData:@{@"realName":@"张三"}];
_codeCustomView.frame = CGRectMake(0, 0, 300, 500);
// View点击方法回调处理
_codeCustomView.submitBtnClickBlock = ^(UIView * _Nonnull view, NSString * _Nonnull keyStr) {
// TODO
};
}
return _codeCustomView;
}
@end
【二】XIB自定义View
基本用法
- 新建
OC
文件MyCustomView.h
,MyCustomView.m
,新建XIB
文件MyCustomView.xib
。 - 在XIB文件中进行UI布局。
- 在Xib的Class中设置类名。
- 在XIB中我们添加控件,进行布局约束了,所以只需要关注
awakeFromNib
方法即可。 - 使用XIB方式,在初始化的时候我们需要返回给到XIB对象。
用法一:
我们需要在自定义View中做操作,需要实例化对象,然后进行逻辑操作。
在MyCustomView.h
中:
@interface MyCustomView : UIView
// XIB初始化方法
+ (instancetype)initWithCustomView;
// 显示View
- (void)showPopView;
// 隐藏View
- (void)dismissPopView;
// Block点击事件回调处理
@property (copy,nonatomic) void (^submitBtnClickBlock)(UIView * view, NSString * keyStr);
@end
在MyCustomView.m
中:
#import "MyCustomView.h"
@interface MyCustomView ()
@property (weak, nonatomic) IBOutlet UIView * infoView;
@property (weak, nonatomic) IBOutlet UIButton *checkBtn;
@property (weak, nonatomic) IBOutlet UIButton *submitBtn;
@property (copy, nonatomic) NSString *keyStr;
@end
@implementation MyCustomView
#pragma mark - 初始化
// XIB初始化方法
+ (instancetype)initWithCustomView{
return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:nil options:nil] lastObject];
}
// Xib初始化完毕第一个调用的方法
- (void)awakeFromNib{
[super awakeFromNib];
[self initBaseConfig];
}
// 在这里写初始化的一些功能和设置
- (void)initBaseConfig {
}
#pragma mark - 视图显示/隐藏控制
// 显示View
- (void)showPopView{
[[[UIApplication sharedApplication] windows].firstObject addSubview:self];
}
// 隐藏View
- (void)dismissPopView{
[self removeFromSuperview];
}
#pragma mark - 点击事件处理
- (IBAction)btnClickAction:(UIButton *)sender {
if (sender == self.checkBtn) {
}else if (sender == self.submitBtn) {
// Block点击事件回调处理
if (self.submitBtnClickBlock) {
self.submitBtnClickBlock(self, @"hello world");
}
}
}
@end
在控制器MainViewCtl.m
中:
#import "MainViewCtl.h"
#import "MyCustomView.h"
@interface MainViewCtl ()
@property (strong,nonatomic) MyCustomView * customView;
@end
@implementation MainViewCtl
- (void)viewDidLoad {
[super viewDidLoad];
// 在合适的时候先显示View
[self.customView showPopView];
// 在合适的时候先隐藏View
[self.customView dismissPopView];
}
#pragma mark - 懒加载
- (MyCustomView *)customView{
if (!_customView) {
_customView = [MyCustomView initWithCustomView];
_customView.frame = CGRectMake(0, 0, 300, 500);
// View点击方法回调处理
_customView.submitBtnClickBlock = ^(UIView * _Nonnull view, NSString * _Nonnull keyStr) {
// TODO
};
}
return _customView;
}
@end
模拟简单弹框VIew使用案例
例如一个弹框功能,我们无需再控制器进行操作,逻辑全部在View中处理。
使用类方法进行初始化即可。
在MyCustomView.h
中:
@interface MyCustomView : UIView
// XIB初始化方法
+ (instancetype)initWithCustomView;
// 带参数的类构造方法
+ (void)initWithCustomViewWithKey:(NSString *)keyStr;
// 显示View
- (void)showPopView;
// 隐藏View
- (void)dismissPopView;
// Block点击事件回调处理
@property (copy,nonatomic) void (^submitBtnClickBlock)(UIView * view, NSString * keyStr);
@end
在MyCustomView.m
中:
#import "MyCustomView.h"
@interface MyCustomView ()
@property (weak, nonatomic) IBOutlet UIView * infoView;
@property (weak, nonatomic) IBOutlet UIButton *checkBtn;
@property (weak, nonatomic) IBOutlet UIButton *submitBtn;
@property (copy, nonatomic) NSString *keyStr;
@end
@implementation MyCustomView
#pragma mark - 初始化
// XIB初始化方法
+ (instancetype)initWithCustomView{
return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:nil options:nil] lastObject];
}
// 带参数的构造方法
+ (void)initWithCustomViewWithKey:(NSString *)keyStr{
MyCustomView *customView = [MyCustomView initWithCustomView];
customView.keyStr = keyStr;
}
// Xib初始化完毕第一个调用的方法
- (void)awakeFromNib{
[super awakeFromNib];
[self initBaseConfig];
}
// 在这里写初始化的一些功能和设置
- (void)initBaseConfig {
// 直接展示View
self.frame = CGRectMake(0, 0, 300, 300);
[self showPopView];
if ([_keyStr isEqualToString:@"YES"]) {
// TODO
}
}
#pragma mark - 视图显示/隐藏控制
// 显示View
- (void)showPopView{
[[[UIApplication sharedApplication] windows].firstObject addSubview:self];
}
// 隐藏View
- (void)dismissPopView{
[self removeFromSuperview];
}
#pragma mark - 点击事件处理
- (IBAction)btnClickAction:(UIButton *)sender {
// 只在CustomView里面完成逻辑处理,和外界不做交互
[self dismissPopView];
if (sender == self.checkBtn) {
self.checkBtn.selected = !self.checkBtn.isSelected;
}else if (sender == self.submitBtn) {
[NSUserDefaults setValue:@"hello world" forKey:@"MYKEY"];
}
}
@end
在控制器MainViewCtl.m
中:
#import "MainViewCtl.h"
#import "MyCustomView.h"
@interface MainViewCtl ()
@end
@implementation MainViewCtl
- (void)viewDidLoad {
[super viewDidLoad];
// 仅做展示,逻辑操作在内部进行
[MyCustomView initWithCustomViewWithKey:@"YES"];
}
@end