zoukankan      html  css  js  c++  java
  • 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, 70, 100)];
    
    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(0, 0, shopViewWidth, shopViewWidth);
    
        // 2.布局文本的位置
    
        self.lable.frame = CGRectMake(0, 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(0, 0, 70, 100);
    
         // 3. 创建所有子控件, 并且设置子控件的属性
    
         UIImageView *iv = [[UIImageView alloc] init];
    
         iv.frame = CGRectMake(0, 0, 70, 70);
    
         UILabel *label = [[UILabel alloc] init];
    
         label.frame = CGRectMake(0, 70, 70, 30);
    
         // 4. 检查子控件是否有连线, 如果有就进行关联
    
         self.iconView = iv;
    
         self.nameLabel = label;
    
         // 5.将所有子控件添加到父控件中
    
         [shopView addSubview:iv];
    
         [shopView addSubview:label];

     

    将来的你会感谢今天如此努力的你! 版权声明:本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    hdu 2647 (拓扑)
    iOS 陀螺仪
    GetMessage()函数使用时的注意
    Button按钮释放时的事件
    深入理解递归:全排列问题
    json实现jsp分页
    EJB事务管理bug修改记
    hdu1159Common Subsequence
    HDOJ 4512 吉哥系列故事——完美队形I
    随机生成长度为100的数组,数组元素为1到10,统计出现次数最多和最少的元素
  • 原文地址:https://www.cnblogs.com/chglog/p/4648152.html
Copyright © 2011-2022 走看看