美文网首页
自定控件

自定控件

作者: 禄子_c79b | 来源:发表于2019-03-15 14:19 被阅读0次

    在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文件中,我们需要对控件进行初始化
    在这里,我们需要了解一下这两个函数的区别

    1. 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
    版权声明:本文为博主原创文章,转载请附上博文链接!

    相关文章

      网友评论

          本文标题:自定控件

          本文链接:https://www.haomeiwen.com/subject/zewlmqtx.html