iOS开发——UI基础-自定义构造方法,layoutSubviews,Xib文件,利用Xib自定义View
一、自定义构造方法
有时候需要快速创建对象,可以自定义构造方法
+ (instancetype)shopView
{
return [[self alloc] init];
} - (instancetype)initWithShop:(NJShop *)shop
{
if (self = [super init]) {
self.shop = shop;
}
return self;
} + (instancetype)shopViewWithShop:(NJShop *)shop
{ return [[self alloc] initWithShop:shop];
}
一般情况下自定义一个控件会重写控件的initWithFrame方法, , 因为用户可能通过init方法创建也可能通过initWithFrame方法创建, 为了保证无论用户通过哪一个方法创建都能添加子控件, 所以重写initWithFrame
init方法内部会调用initWithFrame
- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) { NSLog(@"%s", __func__);
// 1.创建一张图片
UIImageView *iv = [[UIImageView alloc] init];
iv.backgroundColor = [UIColor yellowColor];
[self addSubview:iv];
self.iv = iv; // 2.创建一个文本
UILabel *lable = [[UILabel alloc] init];
lable.backgroundColor = [UIColor purpleColor];
lable.textAlignment = NSTextAlignmentCenter;
[self addSubview:lable];
self.lable = lable;
}
return self;
}
NJShopView *shopView = [[NJShopView alloc] initWithFrame:CGRectMake(shopX, shopY, , )]; NJShopView *shopView = [NJShopView shopView]; NJShopView *shopView = [[NJShopView alloc] initWithShop:self.shops[index]]; NJShopView *shopView = [NJShopView shopViewWithShop: self.shops[index]];
二、layoutSubviews
layoutSubviews方法是专门用于布局子控件的位置的
注意: 重写layoutSubviews方法, 一定要调用[super layoutSubviews]方法 \
如果不调用, 会出现一些奇葩的错误
/*
layoutSubviews方法什么时候调用
1.只要创建一个控件, 那么就会调用
2.只要修改控件的尺寸就会调用(bounds/frame)
3.修改位置不会调用
4.如果当前修改的尺寸和上一次的尺寸没有变化, 不会调用
*/
- (void)layoutSubviews
{
[super layoutSubviews];
NSLog(@"%s", __func__);
CGFloat shopViewWidth = self.frame.size.width;
CGFloat shopViewHeight = self.frame.size.height;
// 1.布局图片的位置
self.iv.frame = CGRectMake(, , shopViewWidth, shopViewWidth);
// 2.布局文本的位置
self.lable.frame = CGRectMake(, shopViewWidth, shopViewWidth, shopViewHeight - self.iv.frame.size.height);
}
三、Xib文件
什么是Xib?
Xib和Storyboard一样都是用来描述界面的
Xib是Storyboard的前身
Xib是用于描述一个简单的界面或者一个局部的界面
Storyboard是用于描述整体

四、利用Xib自定义View
#import <UIKit/UIKit.h> @class NJShop;
@interface XMGShopView : UIView @property(nonatomic, strong)NJShop *shop; + (instancetype)shopView;
@end #import "XMGShopView.h"
#import "NJShop.h" @interface XMGShopView ()
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@end @implementation XMGShopView + (instancetype)shopView
{
return [[[NSBundle mainBundle] loadNibNamed:@"XMGShopView" owner:nil options:nil] firstObject];
} - (void)setShop:(NJShop *)shop
{
_shop = shop; self.iconView.image = [UIImage imageNamed:_shop.icon];
self.nameLabel.text = _shop.name;
} @end
xib加载原理:
// 1. 根据custom class创建对象
XMGShopView *shopView = [XMGShopView alloc] init];
// 2. 根据xib中的设置, 设置控件的相关属性
shopView.backgroundColor = [UIColor redColor];
shopView.frame = CGRectMake(, , , );
// 3. 创建所有子控件, 并且设置子控件的属性
UIImageView *iv = [[UIImageView alloc] init];
iv.frame = CGRectMake(, , , );
UILabel *label = [[UILabel alloc] init];
label.frame = CGRectMake(, , , );
// 4. 检查子控件是否有连线, 如果有就进行关联
self.iconView = iv;
self.nameLabel = label;
// 5.将所有子控件添加到父控件中
[shopView addSubview:iv];
[shopView addSubview:label];
iOS开发——UI基础-自定义构造方法,layoutSubviews,Xib文件,利用Xib自定义View的更多相关文章
- iOS开发UI基础—手写控件,frame,center和bounds属性
iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...
- IOS开发UI基础--数据刷新
IOS开发UI基础--数据刷新 cell的数据刷新包括下面几个方面 加入数据 删除数据 更改数据 全局刷新方法(最经常使用) [self.tableView reloadData]; // 屏幕上的全 ...
- iOS开发UI篇—无限轮播(循环利用)
iOS开发UI篇—无限轮播(循环利用) 一.无限轮播 1.简单说明 在开发中常需要对广告或者是一些图片进行自动的轮播,也就是所谓的无限滚动. 在开发的时候,我们通常的做法是使用一个UIScrollV ...
- IOS开发UI基础UITableView的属性
UITableView UITableView内置了两种样式:UITableViewStylePlain,UITableViewStyleGrouped <UITableViewDataSour ...
- iOS开发-UI基础Demo
现在更多的学习资料都是xCode4.X的,发现xCode6.1还是很多东西,如果有正在学习iOS开发的可以通过Demo简单了解下iOS的UI开发~ 1.新建单视图文件: 2.新建项目名称,语言选择OC ...
- IOS开发UI基础UIImagePickerController的属性
UIImagePickerController 1.+(BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType ...
- iOS开发——UI基础-懒加载,plist文件,字典转模型,自定义view
一.懒加载 只有使用到了商品数组才会创建数组 保证数组只会被创建一次 只要能够保证数组在使用时才创建, 并且只会创建一次, 那么我们就称之为懒加载 lazy - (void)viewDidLoad 控 ...
- IOS开发UI基础之Plis文件-字典转模型
什么是plist文件? 在开发中直接将数据写在代码里面 不是一种合理的做法 如果数据经常改变 就需要经常翻开对应的代码进行修改 造成代码扩展性低 因此,可以考虑将经常变的数据放在⽂文件中进⾏行存储,程 ...
- iOS开发——UI基础-UIScrollView
一.UIScrollView使用的步骤 1.创建UIScrollView 2.将需要展示的内容添加到UIScrollView中 3.设置UIScrollView的滚动范围 (contentSize) ...
随机推荐
- JAVA内存机制
Java程序运行时,数据会分区存放,JavaStack(Java栈). heap(堆).method(方法区). 一.JVM内存模型 1.Java栈Java栈的区域很小,只有1M,特点是存取速度很快, ...
- 9.19 JS数组
数组:相同类型数据的集合强类型语言:1数组里面只能存放相同数据类型的数据 2定义数组的时候需要制定一个长度(可以存放的元素数量) 3内存空间连续集合:1.可以存放任意类型的数据 ...
- 分页进阶--ajax+jquery+struts2
按照上次的分页逻辑,分页查询的业务大概需要几个“零件”:1.当前页:2.总页数:3.跳转页.后端需要处理的是:按照传送过来请求的页码返回相应地数据,并且接受初始化参数的请求:总页码.第一页的数据. 使 ...
- Java递归算法——汉诺塔问题
//================================================= // File Name : Tower_demo //-------------------- ...
- 国内GIT托管服务
http://www.cnblogs.com/TianFang/p/3348949.html
- 平均值mean,众数mode,中值median 和 标准差stddev
平均值mean,众数mode,中值median 和 标准差stddev 均值,众数,中位数,标称差: 均值是就全部数据计算的,它具有优良的数学性质,是实际中应用最广泛的集中趋势测度值.其主要缺点是易受 ...
- centos 7.0 菜鸟接触命令 记录
centos 7.0 最小化安装 查看IP ip addr 查看外网IP curl ifconfig.me 重启 shutdown -r now 安装wget yum -y install wget ...
- Effective Objective-C 2.0 — 第13条:用“方法调配 技术” 调试 “黑盒方法”
自己理解是调配了方法 在运行期,可以向类中新增或替换选择子所对应的方法实现. 使用另一份实现来替换原有的方法实现,这道工序叫做“方法调配”,开发者常用此技术向原有实现中添加新功能. 一般来说,只有调试 ...
- composer错误收集
1. Problem 1 - The requested package ** is satisfiable by ** but these conflict with your requiremen ...
- webuploader横向按钮样式
#picker{display: inline-block;line-height: 1.428571429;vertical-align: middle;margin: 0 12px 0 0;wid ...