020606-08-按钮内部结构

//  ViewController.h
//  03-综合使用
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end
//  ViewController.m
//  03-综合使用
#import "ViewController.h"
#import "XMGShop.h"
#import "XMGShopView.h"

@interface ViewController ()
/** 存放所有商品的整体 */
@property (weak, nonatomic) IBOutlet UIView *shopsView;

/** HUD */
@property (weak, nonatomic) IBOutlet UILabel *hud;

// 文档注释
/** 添加按钮 */
@property (weak, nonatomic) UIButton *addBtn;
/** 删除按钮 */
@property (weak, nonatomic) UIButton *removeBtn;

/** 全部商品数据 */
@property (strong, nonatomic) NSArray *shops;
@end

@implementation ViewController

// 加载plist数据(比较大)
// 懒加载:用到时再去加载,而且也只加载一次
- (NSArray *)shops
{
    if (_shops == nil) {
        // 加载一个字典数组
        NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"shops" ofType:@"plist"]];

        NSMutableArray *shopArray = [NSMutableArray array];
        for (NSDictionary *dict in dictArray) {
            XMGShop *shop = [XMGShop shopWithDict:dict];
            [shopArray addObject:shop];
        }
        _shops = shopArray;
    }
    return _shops;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.shopsView.clipsToBounds = YES;

    // 添加“添加按钮”
    self.addBtn = [self addButtonWithImage:@"add" highImage:@"add_highlighted" disableImage:@"add_disabled" frame:CGRectMake(30, 30, 50, 50) action:@selector(add)];

    // 添加“删除按钮”
    self.removeBtn = [self addButtonWithImage:@"remove" highImage:@"remove_highlighted" disableImage:@"remove_disabled" frame:CGRectMake(270, 30, 50, 50) action:@selector(remove)];
    self.removeBtn.enabled = NO;

    // 加载xib文件
    // Test.xib --编译--> Test.nib
    // 方式1
//    NSArray *objs = [[NSBundle mainBundle] loadNibNamed:@"Test" owner:nil options:nil];
//    [self.view addSubview:objs[1]];

    // 方式2
    // 一个UINib对象就代表一个xib文件
//    UINib *nib = [UINib nibWithNibName:@"Test" bundle:[NSBundle mainBundle]];
    // 一般情况下,bundle参数传nil,默认就是mainBundle
//    UINib *nib = [UINib nibWithNibName:@"Test" bundle:nil];
//    NSArray *objs = [nib instantiateWithOwner:nil options:nil];
//    [self.view addSubview:[objs lastObject]];
}

#pragma mark 添加按钮
- (UIButton *)addButtonWithImage:(NSString *)image highImage:(NSString *)highImage disableImage:(NSString *)disableImage frame:(CGRect)frame action:(SEL)action
{
    // 创建按钮
    UIButton *btn = [[UIButton alloc] init];
    // 设置背景图片
    [btn setBackgroundImage:[UIImage imageNamed:image] forState:UIControlStateNormal];
    [btn setBackgroundImage:[UIImage imageNamed:highImage] forState:UIControlStateHighlighted];
    [btn setBackgroundImage:[UIImage imageNamed:disableImage] forState:UIControlStateDisabled];
    // 设置位置和尺寸
    btn.frame = frame;
    // 监听按钮点击
    [btn addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];
    // 添加按钮
    [self.view addSubview:btn];
    return btn;
}

#pragma mark 添加
- (void)add
{
    // 每一个商品的尺寸
    CGFloat shopW = 80;
    CGFloat shopH = 90;

    // 一行的列数
    int cols = 3;

    // 每一列之间的间距
    CGFloat colMargin = (self.shopsView.frame.size.width - cols * shopW) / (cols - 1);
    // 每一行之间的间距
    CGFloat rowMargin = 10;

    // 商品的索引
    NSUInteger index = self.shopsView.subviews.count;

    // 创建一个父控件(整体:存放图片和文字)
    XMGShopView *shopView = [XMGShopView shopView];

    shopView.shop = self.shops[index];

    // 商品的x值
    NSUInteger col = index % cols;
    CGFloat shopX = col * (shopW + colMargin);

    // 商品的y值
    NSUInteger row = index / cols;
    CGFloat shopY = row * (shopH + rowMargin);

    shopView.frame = CGRectMake(shopX, shopY, shopW, shopH);

    // 添加控件
    [self.shopsView addSubview:shopView];

    // 控制按钮的可用性
    [self checkState];
}

#pragma mark 删除
- (void)remove
{
    [[self.shopsView.subviews lastObject] removeFromSuperview];

    // 控制按钮的可用性
    [self checkState];
}

#pragma mark 检查状态:按钮状态
- (void)checkState
{
    // 删除按钮什么时候可以点击:商品个数 > 0
    self.removeBtn.enabled = (self.shopsView.subviews.count > 0);
    // 添加按钮什么时候可以点击:商品个数 < 总数
    self.addBtn.enabled = (self.shopsView.subviews.count < self.shops.count);

    // 显示HUD
    NSString *text = nil;
    if (self.removeBtn.enabled == NO) { // 删光了
        text = @"已经全部删除";
    } else if (self.addBtn.enabled == NO) { // 加满了
        text = @"已经添加满了";
    }
    if (text == nil) return;

    self.hud.text = text;
    self.hud.alpha = 1.0;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        self.hud.alpha = 0.0;
    });
}

@end
//  XMGShopView.h
//  03-综合使用
#import <UIKit/UIKit.h>
@class XMGShop;

@interface XMGShopView : UIButton
/** 模型数据 */
@property (nonatomic, strong) XMGShop *shop;

+ (instancetype)shopView;
+ (instancetype)shopViewWithShop:(XMGShop *)shop;
@end
//  XMGShopView.m
//  03-综合使用
#import "XMGShopView.h"
#import "XMGShop.h"

@interface XMGShopView()
@end

@implementation XMGShopView

+ (instancetype)shopView
{
    return [self shopViewWithShop:nil];
}

+ (instancetype)shopViewWithShop:(XMGShop *)shop
{
    XMGShopView *shopView = [[self alloc] init];
    shopView.backgroundColor = [UIColor redColor];
    shopView.shop = shop;
    return shopView;
}

- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        self.titleLabel.textAlignment = NSTextAlignmentCenter;
        self.titleLabel.font = [UIFont systemFontOfSize:11];
    }
    return self;
}

- (void)setShop:(XMGShop *)shop
{
    _shop = shop;

    // 设置子控件的数据
    if (shop.icon) {
        [self setImage:[UIImage imageNamed:shop.icon] forState:UIControlStateNormal];
    }

    [self setTitle:shop.name forState:UIControlStateNormal];

    // 不要直接拿出按钮内部的子控件,来修改文字、图片属性
//    self.titleLabel.text = shop.name;
//    self.imageView.image = [UIImage imageNamed:@"shop.icon"];
}

//- (CGRect)imageRectForContentRect:(CGRect)contentRect
//{
//    return CGRectMake(0, 0, contentRect.size.width, contentRect.size.height);
//}
//
//- (CGRect)titleRectForContentRect:(CGRect)contentRect
//{
//    return CGRectMake(0, 30, 70, 30);
//}

- (void)layoutSubviews
{
    [super layoutSubviews];

    CGFloat buttonW = self.frame.size.width;
    CGFloat buttonH = self.frame.size.height;

    CGFloat imageH = buttonW - 10;
    self.imageView.frame = CGRectMake(0, 0, buttonW, imageH);

    self.titleLabel.frame = CGRectMake(0, imageH, buttonW, buttonH - imageH);
}

@end
//  XMGShop.h
//  03-综合使用
#import <Foundation/Foundation.h>

@interface XMGShop : NSObject
/** 商品名称 */
@property (nonatomic, strong) NSString *name;
/** 图标 */
@property (nonatomic, strong) NSString *icon;

- (instancetype)initWithDict:(NSDictionary *)dict;
+ (instancetype)shopWithDict:(NSDictionary *)dict;
@end
//  XMGShop.m
//  03-综合使用
#import "XMGShop.h"

@implementation XMGShop
- (instancetype)initWithDict:(NSDictionary *)dict
{
    if (self = [super init]) {
//        self.name = dict[@"name"];
//        self.icon = dict[@"icon"];
        [self setValuesForKeysWithDictionary:dict];
    }
    return self;
}

+ (instancetype)shopWithDict:(NSDictionary *)dict
{
    return [[self alloc] initWithDict:dict];
}
@end
时间: 2024-11-04 12:11:11

020606-08-按钮内部结构的相关文章

百度哈斯发卡号是减肥哈卡斯加分了卡斯

http://www.ebay.com/cln/ta_ya20/-/167521224015/2015.02.08 http://www.ebay.com/cln/p-m6466/-/167398283011/2015.02.08 http://www.ebay.com/cln/ta_ya20/-/167521242015/2015.02.08 http://www.ebay.com/cln/p-m6466/-/167398294011/2015.02.08 http://www.ebay.co

克同极用后管期果要议向中如极示听适VybVfesyhpR

社保划到税务征收,将大大提升社保费的征管效率.税务的征管能力是目前而言最强的,以后税务征收社保不是代收,属于本职了. 之前税局要把社保信息和交个税的工资比对起来有困难!现在好了,个税是自己的,社保也是自己的,比对困难?不存在的! 这一变革,会给那些不给员工上社保.不全额上社保的企业致命一击! 最新案例 前段时间的发改委关于限制特定严重失信人乘坐民航的一则意见--发改财金[2018]385号,其中还有税务总局的联合署名. http://weibo.com/20180408PP/2309279811

【博客美化】08.添加&quot;扩大/缩小浏览区域大小&quot; 按钮

博客园美化相关文章目录: [博客美化]01.推荐和反对炫酷样式 [博客美化]02.公告栏显示个性化时间 [博客美化]03.分享按钮 [博客美化]04.自定义地址栏logo [博客美化]05.添加GitHub链接 [博客美化]06.添加QQ交谈链接 [博客美化]07.添加打赏按钮 [博客美化]08.添加"扩大/缩小浏览区域大小" 按钮 1.页首添加HTML代码 进入自己的博客园->设置,将以下html代码添加到“页首Html代码” <div id="divExpan

GUI编程笔记08:GUI通过鼠标移动到按钮上更改背景色案例

首先我们看看源代码如下: 1 package cn.itcast_06; 2 3 import java.awt.Button; 4 import java.awt.Color; 5 import java.awt.FlowLayout; 6 import java.awt.Frame; 7 import java.awt.event.MouseAdapter; 8 import java.awt.event.MouseEvent; 9 import java.awt.event.WindowA

08 Jquery UI Button 按钮插件

原文地址:https://www.cnblogs.com/springsnow/p/9461713.html

Bootstrap 3.2.0 源码试读 2014/08/09

第一部分 normalize.css 104至110行 code,    /* 编辑代码 */ kbd,    /* 键盘输入的文本 */ pre, samp {    /* 范例,sample的简写 */   font-family: monospace, monospace;    /* 这个地方应该是写错了,第二字体应该是serif */   font-size: 1em; } 设置字体的大小为1em,字体为monospace. 111至119行 button, input, optgro

微信小程序组件解读和分析:七、button按钮

button按钮组件说明: button,顾名思义,按钮,类似于html的button标签.我们可以设置按钮的属性,比如字体颜色大小,背景颜色等,可以给按钮绑定事件,用户点击时会触发事件. button按钮组件示例代码运行效果如下: 下面是WXML代码: [XML] 纯文本查看 复制代码 ? 1 2 3 4 5 <!--index.wxml--> <view class="content">     <text class="con-text&q

[小北De编程手记] : Lesson 08 - Selenium For C# 之 PageFactory &amp; 团队构建

本文想跟大家分享的是Selenium对PageObject模式的支持和自动化测试团队的构建.<Selenium For C#>系列的文章写到这里已经接近尾声了,如果之前的文章你是一篇篇的读下来并动手实践的话,我相信你应该可以模拟日常工作中80%常见的手动测试用例了.请注意:我的用词是模拟用例,而不是书写自动化测试用例.一个企业级的自动化测试的构建不是单靠Selenium一种技术就能Hold住的.所谓模拟指的是只能实现自动化的某个Case,但是不能工程化的使用.在本人所接触过几家公司的自动化测试

NGUI使用3——制作图集&amp;自定义按钮&amp;切换按钮图片

1,准备素材新建一个文件夹,命名为UITexture. 2,创建Atlas在Project面板中,进入UITexture 文件夹,选中这两张图片,然后 右键-->[NGUI]-->[Atlas Maker],之后你会看到 Atlas Maker 的界面:在 Atlas Maker 界面中,点击[Create]按钮. 之后给这个Atlas 起名为MyAtlas.prefab,点击[保存]. 3,预览Atlas和Sprite保存之后,这个新的Atlas 就创建好了.可以点击一下[View Spri

Java微信公众平台开发模式+自定义按钮源码

首先,想用开放模式需要先成为开发者.成为开发者有两种写法. 一是:通过jsp页面,用out.print("echostr")//SHA1加密的字符串: 二是:通过Servlet.doGet返回exhostr,给微信平台. 这里我只写第二种方式的请求(这里的请求是以get方式请求),代码如下: import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.ut