• ios18---自定义控件3改进


    控制器:

    //  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
    /**
     *  懒加载,get方法
     */
    - (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 _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.创建一个商品*****************************/
       /*
        XMGShopView *shopView = [[XMGShopView alloc] init];
        shopView.frame = CGRectMake(x, y, width, height);
        // 设置数据
         XMGShop *shop = self.dataArr[index];
        shopView.shop = shop;
        [self.shopCarView addSubview:shopView];
        */
        
        XMGShopView *shopView = [XMGShopView shopViewWithShop:self.dataArr[index]];
        shopView.frame = CGRectMake(x, y, width, height);
        [self.shopCarView addSubview:shopView];
     
    /***********************3.设置数据*****************************/
        // 设置数据
    //    XMGShop *shop = self.dataArr[index];
    //    [shopView setIcon:shop.icon];
    //    [shopView setName: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>
    @class XMGShop;
    
    @interface XMGShopView : UIView
    
    /** 商品模型 */
    @property (nonatomic, strong) XMGShop *shop;
    
    // 构造方法
    - (instancetype)initWithShop: (XMGShop *)shop;
    + (instancetype)shopViewWithShop: (XMGShop *)shop;
    
    @end
    //  XMGShopView.m
    
    #import "XMGShopView.h"
    #import "XMGShop.h"
    
    @interface XMGShopView ()
    /** 图片控件 */
    @property (nonatomic, weak) UIImageView *iconView;
    /** 标题控件 */
    @property (nonatomic, weak) UILabel *titleLabel;
    @end
    
    @implementation XMGShopView
    
    /**
     *  初始化子控件(不要设置frame)
     *
     */
    - (instancetype)init{
        if (self = [super init]) {
            [self setUp];
        }
        return self;
    }
    
    //构造方法,对象方法
    - (instancetype)initWithShop:(XMGShop *)shop{
        if (self = [super init]) {
            // 注意:先创建后赋值,不然空指针,
            [self setUp];
            self.shop = shop;//调用set方法
        }
        return self;
    }
    //构造方法,类方法
    + (instancetype)shopViewWithShop:(XMGShop *)shop{
        return [[self alloc] initWithShop:shop];
    }
    
    /**
     *  初始化
     */
    - (void)setUp{
        // 1.创建商品的UIImageView对象
        UIImageView *iconView = [[UIImageView alloc] init];
        iconView.backgroundColor = [UIColor blueColor];
        [self addSubview:iconView];
        _iconView = iconView;
        
        // 2.创建商品标题对象
        UILabel *titleLabel = [[UILabel alloc] init];
        titleLabel.backgroundColor = [UIColor yellowColor];
        titleLabel.textAlignment = NSTextAlignmentCenter; // 居中
        [self addSubview:titleLabel];
        _titleLabel = titleLabel;
    }
    
    
    
    /**
     *  布局子控件(可以拿到frame)
     */
    - (void)layoutSubviews{
        // 0.一定要调用super
        [super layoutSubviews];
        
        // 1.获取当前控件的尺寸
        CGFloat width = self.frame.size.width;
        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);
    }
    
    /**
     *  重写set方法:只要外边传数据就会调用
     *  作用:设置数据
     */
    - (void)setShop:(XMGShop *)shop{
        _shop = shop;
        
        // 设置数据
        self.iconView.image = [UIImage imageNamed:shop.icon];
        self.titleLabel.text = shop.name;
    }
    
    
    @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
  • 相关阅读:
    Python 如何隐藏属性
    Python 多态
    Python 绑定方法与非绑定方法
    Python 类的组合
    ASP.NET CS文件中输出JavaScript脚本的3种方法以及区别
    JQuery中$之选择器用法介绍
    C#语言之“string格式的日期时间字符串转为DateTime类型”的方法
    .net中response.redirect sever.execute server.transfer 三种页面跳转的方法
    safari,chrome中的window.history.go(-1) history.back()
    onbeforeunload与onunload事件
  • 原文地址:https://www.cnblogs.com/yaowen/p/7466861.html
Copyright © 2020-2023  润新知