一、自定义构造方法


有时候需要快速创建对象,可以自定义构造方法

+ (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的更多相关文章

  1. iOS开发UI基础—手写控件,frame,center和bounds属性

    iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...

  2. IOS开发UI基础--数据刷新

    IOS开发UI基础--数据刷新 cell的数据刷新包括下面几个方面 加入数据 删除数据 更改数据 全局刷新方法(最经常使用) [self.tableView reloadData]; // 屏幕上的全 ...

  3. iOS开发UI篇—无限轮播(循环利用)

    iOS开发UI篇—无限轮播(循环利用) 一.无限轮播  1.简单说明 在开发中常需要对广告或者是一些图片进行自动的轮播,也就是所谓的无限滚动. 在开发的时候,我们通常的做法是使用一个UIScrollV ...

  4. IOS开发UI基础UITableView的属性

    UITableView UITableView内置了两种样式:UITableViewStylePlain,UITableViewStyleGrouped <UITableViewDataSour ...

  5. iOS开发-UI基础Demo

    现在更多的学习资料都是xCode4.X的,发现xCode6.1还是很多东西,如果有正在学习iOS开发的可以通过Demo简单了解下iOS的UI开发~ 1.新建单视图文件: 2.新建项目名称,语言选择OC ...

  6. IOS开发UI基础UIImagePickerController的属性

    UIImagePickerController 1.+(BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType ...

  7. iOS开发——UI基础-懒加载,plist文件,字典转模型,自定义view

    一.懒加载 只有使用到了商品数组才会创建数组 保证数组只会被创建一次 只要能够保证数组在使用时才创建, 并且只会创建一次, 那么我们就称之为懒加载 lazy - (void)viewDidLoad 控 ...

  8. IOS开发UI基础之Plis文件-字典转模型

    什么是plist文件? 在开发中直接将数据写在代码里面 不是一种合理的做法 如果数据经常改变 就需要经常翻开对应的代码进行修改 造成代码扩展性低 因此,可以考虑将经常变的数据放在⽂文件中进⾏行存储,程 ...

  9. iOS开发——UI基础-UIScrollView

    一.UIScrollView使用的步骤 1.创建UIScrollView 2.将需要展示的内容添加到UIScrollView中 3.设置UIScrollView的滚动范围 (contentSize) ...

随机推荐

  1. BZOJ3685: 普通van Emde Boas树

    显然这题的所有操作都可以用set,但是直接用set肯定要T,考虑到读入量较大,使用fread读入优化,就可以卡过去了. #include<bits/stdc++.h> using name ...

  2. uC/OS-II全局变量定义

    /*************************************************************************************************** ...

  3. LDA(主题模型算法)

    LDA整体流程 先定义一些字母的含义: 文档集合D,topic集合T D中每个文档d看作一个单词序列< w1,w2,...,wn >,wi表示第i个单词,设d有n个单词.(LDA里面称之为 ...

  4. C++学习之Pair

    C++学习之Pair Pair类型概述 pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下: pair<int, string> a; 表示a中有两个类型, ...

  5. 以全局监听的方式处理img的error事件

    http://www.ovaldi.org/2015/09/11/%E4%BB%A5%E5%85%A8%E5%B1%80%E7%9B%91%E5%90%AC%E7%9A%84%E6%96%B9%E5% ...

  6. 菜单each+hover

    <script type="text/javascript"> $(document).ready(function(){ var src1= new Array('i ...

  7. Robot Framework--12 RFS+AutoItLibrary测试web对话框

    转自:http://blog.csdn.net/tulituqi/article/details/21871247 Selenium2library在我们实际测试web页面的时候基本上已经够用了,不过 ...

  8. C# 向IQueryable添加一个Include扩展方法

    using System; using System.Data.Objects; using System.Linq; namespace OutOfMemory.Codes { /// <su ...

  9. apache 的工作模式

    总结:访问量大的时候使用 worker模式:  每个进程,启动多个线程来处理请求,每个线程处理一次请求,对内存要求比较高. prefoek模式 : 每个子进程只有一个线程,一次请求一个进程. 什么是a ...

  10. QQ空间HD(3)-Modal的切换效果总结

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { UIViewController ...