在iOS开发中经常遇到自定的控件,平时常用的一种是用到代码的方式自定义,一种是用XIB的方式自定义
1.代码的方式自定义
在这里自定义一个按钮为例
自定义的按钮上面要添加一些东西,这样我们就可以吧要添加的东西做为成员变量
(1)自定义按钮
- (UIImageView *)lingImageView {
if (_lingImageView == nil) {
_lingImageView = [[UIImageView alloc] init];
_lingImageView.backgroundColor = [UIColor color6];
_lingImageView.hidden = YES;
}
return _lingImageView;
}
在这里是添加了一个view在按钮上
然后重写他的frame方法,并且把它添加到这个按钮上
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self setTitleColor:[UIColor color1] forState:UIControlStateNormal];
[self setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected];
self.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 5);
self.titleEdgeInsets = UIEdgeInsetsMake(0, 5, 0, 0);
[self addSubview:self.lingImageView];
}
return self;
}
在这里要注意的是要调用它的layoutSubviews才能使控件的位置达到你想要的位置
- (void)layoutSubviews {
[super layoutSubviews];
_lingImageView.frame = CGRectMake(0, 0, self.width, 2);
}
这里有个小细节需要注意的是,在每次调用set方法是,都要调用弗雷的set方法,比如这里要重新设置按钮的选中状态,就可以这样做
- (void)setSelected:(BOOL)selected {
[super setSelected:selected];
_lingImageView.hidden = selected;
}
(2)自定义一般的控件
代码自定义控件的好处我自己觉得是维护起来比较方便,位置用MAS适配比较好一点
其实步骤和上面还是一样的,比如说自定义一个帮助的引导视图
/**
- 帮助图的容器
/
@property (nonatomic ,strong)UIImageView startImageView;
/ - 帮助图
/
@property (nonatomic,strong)UIImage startImage;
/ - 取消按钮
/
@property (nonatomic,strong)UIButton cancleBtn;
/ - 取消按钮的代理
/
@property (nonatomic,assign)id<CancleBtnClickedDelegate>delegate;
/* - 设置帮助图
*/
- (void)setImageWithStartImag:(UIImage *)startImage frame:(CGRect)frame centerPoint :(CGPoint )point;
- (void)setCancleBtnFrame:(CGRect)frame centerPoint:(CGPoint)centerPoint;
在.m文件中,我们需要对控件进行初始化
在这里,我们需要了解一下这两个函数的区别
- initWithFrame方法是什么?
initWithFrame方法用来初始化并返回一个新的视图对象,根据指定的CGRect(尺寸)。
当然,其他UI对象,也有initWithFrame方法,但是,我们以UIView为例,来搞清楚initWithFrame方法。
简单的说,我们用编程方式申明,创建UIView对象时,使用initWithFrame方法。
在此,我们必须搞清楚,两种方式来进行初始化UIView。
2.initWithCoder方法是什么?
这种方式,就是使用nib文件。通常我们说的“拖控件” 的方式。
实际编程中,我们如果用Interface Builder 方式创建了UIView对象。(也就是,用拖控件的方式)
那么,initWithFrame方法方法是不会被调用的。因为nib文件已经知道如何初始化该View。(因为,我们在拖该view的时候,就定义好了长、宽、背景等属性)。
这时候,会调用initWithCoder方法,我们可以用initWithCoder方法来重新定义我们在nib中已经设置的各项属性。
这就是为什么使用initWithCoder:的原因,因为BIDViewController.xib的view是BIDQuartzFunView类型,而不是UIView类型了,所以其实是从nib中加载对象实例。
接下来就是例子
就是我们声明一个UIView的子类,进行“手工”编写代码的方式。
实际编程中,我们使用编程方式下,来创建一个UIView或者创建UIView的子类。这时候,将调用initWithFrame方法,来实例化UIView。
特别注意,如果在子类中重载initWithFrame方法,必须先调用父类的initWithFrame方法。在对自定义的UIView子类进行初始化操作。
比如:
- (id)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];// 先调用父类的initWithFrame方法
if (self) {
// 再自定义该类(UIView子类)的初始化操作。
_scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
[_scrollView setFrame:CGRectMake(0, 0, 320, 480)];
_scrollView.contentSize = CGSizeMake(320*3, 480);
[self addSubview:_scrollView];
}
return self;
}
在这里,我想,应该对initWithFrame方法略知一二了。
当我们所写的程序里没用用Nib文件(XIB)时,用代码控制视图内容,需要调用initWithFrame去初始化
- (id)initWithFrame:(CGRect)frame
{
if (self =[superinitWithFrame:frame]) {
// 初始化代码
}
return self;
}
用于视图加载nib文件,从nib中加载对象实例时,使用 initWithCoder初始化这些实例对象
- (id)initWithCoder:(NSCoder*)coder
{
if (self =[superinitWithcoder:coder]) {
// 初始化代码
}
return self;
}
1.initWithCoder: 对于.xib,当你嵌入一个视图对象到xib,视图加载时默认调用的是该方法;例如:假如创建的view来自nib,那么将会调用initWithCoder,由系统来调用,自己不能调用。
2.initWithFrame: 非.xib的手动编码,视图加载时默认调用的是该方法。是由自己调用,来初始化对象的
-
(instancetype)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithCoder:aDecoder]) {
[self setup];
}
return self;
} -
(instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self setup];
}
return self;
}
2.接下来我们看xib的自定义View
在iOS开发中,我们有时候需要在短时间内完成一些事情,这样就用到了XIB布局,首先我们先创建XIB文件
这里就不在啰嗦,把控件布局好后,需要什么控件可以拖出来,然后用懒加载的方式,去做初始化,直接上代码
import <UIKit/UIKit.h>
@protocol CancelBtnClickedDelegate <NSObject>
-(void)CancelBtnClicked;
@end
@interface SearchView : UIView
@property (weak, nonatomic) IBOutlet UIButton *CancelBtn;
@property (weak, nonatomic) IBOutlet UITextField *searchBarTextFild;
@property (nonatomic,assign)id<CancelBtnClickedDelegate>delegate;
- (IBAction)cancelBtnClick:(UIButton *)sender;
+(instancetype) searchView;
@end
在这里,这个代理是用来执行自定义视图的点击事件
类方法searchVivew是用来初始化控件
+(instancetype)searchView
{
return [[NSBundle mainBundle] loadNibNamed:@"SearchView" owner:self options:nil].firstObject;
}
作者:Jamison_Fan
来源:CSDN
原文:https://blog.csdn.net/MyCSDN_FanJinxin/article/details/51142920
版权声明:本文为博主原创文章,转载请附上博文链接!
网友评论