• ios16--自定义控件1


    k控制器:

    //
    //  XMGViewController.h
    
    #import <UIKit/UIKit.h>
    
    @interface XMGViewController : UIViewController
    
    
    @end
    //
    //  XMGViewController.m
    
    #import "XMGViewController.h"
    #import "XMGShop.h"
    #import "XMGShopView.h"
    
    @interface XMGViewController ()
    
    // 购物车
    @property (weak, nonatomic) IBOutlet UIView *shopCarView;
    // 添加按钮
    @property (weak, nonatomic) IBOutlet UIButton *addButton;
    // 删除按钮
    @property (weak, nonatomic) IBOutlet UIButton *removeButton;
    
    /** 数据数组 */
    @property (nonatomic, strong) NSArray *dataArr;
    @end
    
    @implementation XMGViewController
    /**
     *  懒加载
     */
    - (NSArray *)dataArr{
        if (_dataArr == nil) {
            // 加载数据
            // 1.获取全路径
            NSString *dataPath = [[NSBundle mainBundle] pathForResource:@"shopData.plist" ofType:nil];
            self.dataArr = [NSArray arrayWithContentsOfFile:dataPath];
            // 字典转模型
            // 创建临时数组
            NSMutableArray *tempArray = [NSMutableArray array];
            for (NSDictionary *dict in self.dataArr) {
                // 创建shop对象
                XMGShop *shop = [XMGShop shopWithDict:dict];
                // 把模型装入数组
                [tempArray addObject:shop];
            }
            self.dataArr = tempArray;
        }
        return _dataArr;
    }
    
    // 初始化数据
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    /**
     *  添加到购物车
     *
     *  @param button 按钮
     */
    - (IBAction)add:(UIButton *)button {
    /***********************1.定义一些常量*****************************/
        // 1.总列数
        NSInteger allCols = 3;
        // 2.商品的宽度 和 高度
        CGFloat width = 80;
        CGFloat height = 100;
        // 3.求出水平间距 和 垂直间距
        CGFloat hMargin = (self.shopCarView.frame.size.width - allCols * width) / (allCols -1);
        CGFloat vMargin = (self.shopCarView.frame.size.height - 2 * height) / 1;
        // 4. 设置索引
        NSInteger index = self.shopCarView.subviews.count;
        // 5.求出x值
        CGFloat x = (hMargin + width) * (index % allCols);
        CGFloat y = (vMargin + height) * (index / allCols);
        
    /***********************2.创建一个商品*****************************/
        /*
         原来的分开创建:
      // 1.创建商品的view
        UIView *shopView = [[UIView alloc] init];
        
      // 2.设置frame
        shopView.frame = CGRectMake(x, y, width, height);
        
      // 3.设置背景颜色
        shopView.backgroundColor = [UIColor greenColor];
        
      // 4.添加到购物车
        [self.shopCarView addSubview:shopView];
        
      // 5.创建商品的UIImageView对象
        UIImageView *iconView = [[UIImageView alloc] init];
        iconView.frame = CGRectMake(0, 0, width, width);
        iconView.backgroundColor = [UIColor blueColor];
        [shopView addSubview:iconView];
        
      // 6.创建商品标题对象
        UILabel *titleLabel = [[UILabel alloc] init];
        titleLabel.frame = CGRectMake(0, width, width, height - width);
        titleLabel.backgroundColor = [UIColor yellowColor];
        titleLabel.textAlignment = NSTextAlignmentCenter; // 居中
        [shopView addSubview:titleLabel];
         */
    
        XMGShopView *shopView = [[XMGShopView alloc] init];
        shopView.frame = CGRectMake(x, y, width, height);
        [self.shopCarView addSubview:shopView];
    
        
    /***********************3.设置数据*****************************/
        // 设置数据
        XMGShop *shop = self.dataArr[index];
        shopView.iconView.image = [UIImage imageNamed:shop.icon];
        shopView.titleLabel.text = shop.name;
    
        
    /***********************4.设置按钮的状态*****************************/
    
        button.enabled = (index != 5);
        
        // 5.设置删除按钮的状态
        self.removeButton.enabled = YES;
        
    }
    
    /**
     *  从购物车中删除
     *
     *  @param button 按钮
     */
    - (IBAction)remove:(UIButton *)button {
        // 1. 删除最后一个商品
        UIView *lastShopView = [self.shopCarView.subviews lastObject];
        [lastShopView removeFromSuperview];
        
        // 3. 设置添加按钮的状态
        self.addButton.enabled = YES;
        
        // 4. 设置删除按钮的状态
        self.removeButton.enabled = (self.shopCarView.subviews.count != 0);
        
    }
    @end

    自定义控件;

    //
    //  XMGShopView.h
    
    #import <UIKit/UIKit.h>
    
    @interface XMGShopView : UIView
    /** 图片控件 */
    @property (nonatomic, weak) UIImageView *iconView;// [self addSubview:iconView];已经有强指针引用了,这里用weak
    /** 标题控件 */
    @property (nonatomic, weak) UILabel *titleLabel;
    @end
    //
    //  XMGShopView.m
    
    #import "XMGShopView.h"
    
    @interface XMGShopView ()
    
    
    
    @end
    
    @implementation XMGShopView
    
    /**
     *  初始化子控件(不要设置frame,获取的宽度高度是0,在layoutSubviews可以拿到)
     *
     */
    - (instancetype)init{
        if (self = [super init]) {
            /*
            // 0.获取当前控件的尺寸
            CGFloat width = self.frame.size.width;
            CGFloat height = self.frame.size.height; //
            
            NSLog(@"init:%f----%f", width, height);
            */
            // 1.创建商品的UIImageView对象
            UIImageView *iconView = [[UIImageView alloc] init];
    //        iconView.frame = CGRectMake(0, 0, width, width);
            iconView.backgroundColor = [UIColor blueColor];
            [self addSubview:iconView];
            self.iconView = iconView;
            
            // 2.创建商品标题对象
            UILabel *titleLabel = [[UILabel alloc] init];
    //        titleLabel.frame = CGRectMake(0, width, width, height - width);
            titleLabel.backgroundColor = [UIColor yellowColor];
            titleLabel.textAlignment = NSTextAlignmentCenter; // 居中
            [self addSubview:titleLabel];//强指针引用了
            self.titleLabel = titleLabel;//titleLabel变成全局的,不然layoutSubviews()方法里面获取不到,
        }
        return self;
    }
    
    /**
     *  布局子控件(可以拿到frame)
     */
    - (void)layoutSubviews{
        // 0.一定要调用super,保留父类系统的布局。否则父类的布局就没了。
        [super layoutSubviews];
        
        // 1.获取当前控件的尺寸
        CGFloat width = self.frame.size.width;//这个frame是从外面shopView.frame = CGRectMake(x, y, width, height);获取的
        CGFloat height = self.frame.size.height;
        
        // 2.设置子控件的frame
         self.iconView.frame = CGRectMake(0, 0, width, width);
         self.titleLabel.frame = CGRectMake(0, width, width, height - width);
    }
    
    @end

    bean:

    //
    //  XMGShop.h
    
    #import <Foundation/Foundation.h>
    
    @interface XMGShop : NSObject
    
    /** 图片的名称 */
    @property (nonatomic, copy) NSString *icon;
    /** 商品的名称 */
    @property (nonatomic, copy) NSString *name;
    
    
    // 提供构造方法
    /*
    - (instancetype)initWithIcon: (NSString *)icon name: (NSString *)name;
    + (instancetype)shopWithIcon: (NSString *)icon name: (NSString *)name;
     */
    
    - (instancetype)initWithDict:(NSDictionary *)dict;
    + (instancetype)shopWithDict:(NSDictionary *)dict;
    
    @end
    //
    //  XMGShop.m
    
    #import "XMGShop.h"
    
    @implementation XMGShop
    /*
    - (instancetype)initWithIcon:(NSString *)icon name:(NSString *)name{
        if (self = [super init]) {
            self.icon = icon;
            self.name = name;
        }
        return self;
    }
    
    + (instancetype)shopWithIcon:(NSString *)icon name:(NSString *)name{
        return [[self alloc] initWithIcon:icon name:name];
    }
     */
    
    - (instancetype)initWithDict:(NSDictionary *)dict{
        if (self = [super init]) {
            self.icon = dict[@"icon"];
            self.name = dict[@"name"];
        }
        return self;
    }
    
    + (instancetype)shopWithDict:(NSDictionary *)dict{
        return [[self alloc] initWithDict:dict];
    }
    
    @end
  • 相关阅读:
    开源协议
    markdown 语法和工具
    mac 终端 使用ftp命令
    谷歌囧大了!安统镜卓5.0刷入遇到system.img系像找不到
    linux下vi命令大全
    python编码处理:unicode字节串转成中文 各种字符串举例说明
    优秀前端资源备忘录
    mousewheel滚轮事件
    bootstrap插件之Carousel
    初识Node.js
  • 原文地址:https://www.cnblogs.com/yaowen/p/7466723.html
Copyright © 2020-2023  润新知