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];

 

将来的你会感谢今天如此努力的你! 版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:https://www.cnblogs.com/chglog/p/4648152.html