zoukankan      html  css  js  c++  java
  • ios17--自定义控件2改进

    控制器:

    //
    //  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 _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];
     
    //    shopView.titleLabel = nil;
    /***********************3.设置数据*****************************/
        // 设置数据
        XMGShop *shop = self.dataArr[index];
        /*
        shopView.iconView.image = [UIImage imageNamed:shop.icon];
        shopView.titleLabel.text = shop.name;
         */
        [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>
    
    @interface XMGShopView : UIView
    // readonly 只会调用get方法
    /** 图片控件 */
    //@property (nonatomic, weak, readonly) UIImageView *iconView;// [self addSubview:iconView];已经有强指针引用了,这里用weak
    
    /** 标题控件 */
    //@property (nonatomic, weak, readonly) UILabel *titleLabel;
    
    // 提供接口方法
    - (void)setIcon: (NSString *)icon;
    - (void)setName: (NSString *)name;
    @end
    //
    //  XMGShopView.m
    
    #import "XMGShopView.h"
    
    @interface XMGShopView ()  //扩展属性
    @property (nonatomic, strong) UIImageView *iconView;//[self addSubview:iconView];有强指针指向了,用weak
    @property (nonatomic, strong) UILabel *titleLabel;
    @end
    
    @implementation XMGShopView
    
    /**
     *  初始化子控件(不要设置frame)
     *
     */
    - (instancetype)init{
        if (self = [super init]) {
            // 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;
        }
        return self;
    }
    
    /**
     *  布局子控件(可以拿到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);
    }
    
    - (void)setIcon:(NSString *)icon{
       // 设置数据
        self.iconView.image = [UIImage imageNamed:icon];
    }
    
    - (void)setName:(NSString *)name{
      // 设置数据
        self.titleLabel.text = 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
  • 相关阅读:
    linux安装pip
    keepalived 安装和配置
    SecureCRT突然卡死的问题
    python url合并与分离
    centos 长久路由表
    linux shell中 if else以及大于、小于、等于逻辑表达式介绍
    mtime,ctime,atime
    linux学习初体验
    Python数据库连接池DBUtils
    Flask 中的蓝图(BluePrint)
  • 原文地址:https://www.cnblogs.com/yaowen/p/7466778.html
Copyright © 2011-2022 走看看