iOS UI基础学习 Note_dayFive

昨天漏了一天没做笔记,原因是在前天的学习计划没全部完成,所以昨天早上终于补全了,结果在倒弄安装第三方插件的时候才发现原来Xcode8开始已经禁止安装插件了.一开始通过复制另一份Xcode然后通过修改名字,添加签名,获取UUID等一系列操作还是能够在复制出来的Xcode上面成功安装插件的.但我有点手贱而且作为学生党省吃俭用才买下的RMBP 128G.复制的方法占用了10G的内存,无法接受.最后一通瞎搞终于把这个软件搞崩溃了,一输入就闪退.所以我经历了删除-appStore龟速下载(XcodeGhost事件让我不敢相信网盘,虽然我没经历过)-花了6个小时终于重新安装,发现还是闪退---查找原因删除残留的插件到了昨天晚上10点才搞定我的天,所以边回忆知识点边敲了2小时的代码,早上又跑去看美国春晚折腾到现在才能记录上这两天的东西

第五天的知识点大概是还是之前第三天第四天的一个拓展,一个是控件通过代码在初始化时调用的一个方法,第二个是通过Xib来自定义控件(不得不说这货比代码来创建简单多了)第三是巩固字典转成模型的套路,第四是UIButton内部属性的一些使用(包含了UIImageView,UILabel)第五是一个渐变动画的学习,第六是KVC&KVO的一个了解,初步学习.

控件通过代码初始化

通过[[类名 alloc]init还是[[类名 alloc]initWithFrame创建对象时系统会调用initWithFrame方法,因此在初始化控件的一些代码可以通过重写initWithFrame方法来实现

Xib

Xib类似一个Storyboard,不过是一个自定义控件的一个功能,通过创建Xib,在ViewController.m获取Xib的路径来加载Xib,注入数据 下面通过一个demo来说明

  • 这是Xib的界面
    dayFive01
    模拟新闻软件的一个控件
    通过创建一个继承UIView的类与它关联,进行导入数据,核心代码如下:
@class CarData;
//引入数据模型的类
@interface CarView : UIView
@property (nonatomic, strong) CarData *car;
//接收数据模型
- (instancetype)initWithCar:(CarData *)car;
+ (instancetype)carview;
//提供两个快速构造方法
@end

#import "CarData.h"
@interface CarView ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView; 
//显示图片控件
@property (weak, nonatomic) IBOutlet UILabel *title;
//主标题
@property (weak, nonatomic) IBOutlet UILabel *subtitle;
//子标题
@property (weak, nonatomic) IBOutlet UILabel *follow;
//跟帖数
@end
@implementation CarView


-(void)setCar:(CarData *)car
{
    _car = car;
    self.imageView.image = [UIImage imageNamed:car.image];
    //将数据模型导入到控件中
    self.title.text = car.title;
    self.subtitle.text = car.subTitle;
    self.follow.text = car.follow;
}
- (instancetype)initWithCar:(CarData *)car
{
    if (self = [super init]) {
        _car = car;
    }
    return self;
}

+ (instancetype)carview
{
    return [[[NSBundle mainBundle]loadNibNamed:@"CarView" owner:nil options:nil]firstObject];
    //加载Supporting Files中的xib文件
}
@end

- (void)viewDidLoad {
    CarView *image = [CarView carview];
//加载Xib控件
    image.frame = CGRectMake(0, 100, 375, 100);
//设置位置
    NSDictionary *dict = @{@"image":@"car",@"title":@"2016款兰博基尼",@"subtitle":@"2016款兰博基尼 非常好看",@"follow":@"233跟帖"};
//数据
    CarData *cardata = [CarData cardataWithDict:dict];
    [image setCar:cardata];
    [self.view addSubview:image];
}

运行时的截图
dayFive02

如何让Xib和一个类关联呢?
dayFive03

创建xib时,View的大小不可调,这个时候
dayFive04

字典转模型

在模型的.h文件中创建所有数据的属性,创建快速构造方法,快速构造方法中药接受一个字典,把字典的键对值取出并赋值给属性
例如上一个demo中的,数据包括图片,子标题,主标题,跟帖数,所以创建一个模型时,把所有需要的数据内容都创建对应的属性

#import <Foundation/Foundation.h>

@interface CarData : NSObject
//标题
@property (nonatomic, copy) NSString *title;
//子标题
@property (nonatomic, copy) NSString *subTitle;
//图片
@property (nonatomic, copy) NSString *image;
//跟帖数
@property (nonatomic, copy) NSString *follow;

-(instancetype)initWithDict:(NSDictionary *)dict;
+(instancetype)cardataWithDict:(NSDictionary *)dict;
@end

UIButton的内部属性

利用UIButton的内部属性,改善dayFour的模拟购物车demo,创建一个继承UIButton的类,然后在类里面修改UIButton的属性,具体代码如下:

#import <UIKit/UIKit.h>
@class Shopdata;
@interface button : UIButton

@property (nonatomic, strong) Shopdata *shopdata;
//接收一个数据模型
@end

#import "Shopdata.h"

@implementation button

- (instancetype)initWithFrame:(CGRect)frame
{
//重写initWithFrame方法,初始化内部属性
    if (self = [super initWithFrame:frame]) {
        self.titleLabel.textAlignment = NSTextAlignmentCenter;
        [self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    }
    return self;
}

-(void)layoutSubviews{
//改变内部空间布局
    [super layoutSubviews];
    CGFloat width = self.frame.size.width;
    CGFloat height = self.frame.size.height;
//获取控件大小
    self.titleLabel.frame = CGRectMake(0, width, width, height - width);
//改变内部控件大小
    self.imageView.frame = CGRectMake(0, 0, width, width);
}

//注入数据
- (void)setShopdata:(Shopdata *)shopdata
{
    _shopdata = shopdata;
    [self setImage:[UIImage imageNamed:shopdata.icon] forState:UIControlStateNormal];
//因为是UIButton 所以设置图片和文字应该通过set方法
    [self setTitle:shopdata.name forState:UIControlStateNormal];
}

截图如下:
dayFive05

渐变动画

利用渐变动画来做一个提示框,沿用上一个demo,先在Storyboard中创建一个UILabel 将透明度设置为0,当购物车满时,提示购物车满了,渐变显示.当删除商品直至为0时,提示购物车已空.同样是渐变显示,核心代码如下:

/*
animateWithDuration 动画时长
animations: 需要完成的动作
completion:^(BOOL finished) 结束时需要完成的动作
delay:延时
options:动画播放的方式
*/
- (void)showHUB:(NSString *)text{
    [UIView animateWithDuration:1.f animations:^{
        self.showHUB.alpha = 1;
        self.showHUB.text = text;
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:1.f delay:0.5f options:UIViewAnimationOptionCurveLinear animations:^{
            self.showHUB.alpha = 0;
        } completion:nil];
    }];
}

截图如下:
dayFive06

dayFive07

(不能上传Gif无法看出动画心情复杂)

KVC&KVO

KVC:Key Value Coding (键值编码)
KVO:Key Value Observing (键值监听)

KVC的功能略强大,可以简单赋值也可以综合赋值,甚至可以给私有属性赋值等等,直接代码和注释说明吧

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main(int argc, const char * argv[]) {
    Person *per = [[Person alloc]init];
    per.dog = [[Dog alloc]init];
/*********对私有变量赋值*****************/
    [per setValue:@"20" forKey:@"age"];
/*********普通赋值*****************/
    [per setValue:@"zjh" forKeyPath:@"_name"];
/*********综合赋值*****************/
    [per setValue:@"wangcai" forKeyPath:@"dog.name"];
    NSLog(@"%@",per.dog.name);
    NSLog(@"%@",per);
/*********字典转模型*****************/

    NSDictionary *dict1 = @{
                           @"name":@"zgh",@"age":@"25"
                           };
    Person *per2 = [[Person alloc]init];
    [per2 setValuesForKeysWithDictionary:dict1];
    NSLog(@"%@",per2);

/*********取值*****************/
    Person *per3 = [[Person alloc]init];
    per3.name = @"wangcai";
    NSLog(@"%@",[per3 valueForKeyPath:@"name"]);
/*********字典转模型*****************/
    Person *per4 = [[Person alloc]init];
    per4.name = @"didi";
    per4.money = 199.99;
    NSDictionary *dict = [per4 dictionaryWithValuesForKeys:@[@"name",@"money"]];
    NSLog(@"%@",dict);
/*********取出数组中所有模型的摸个属性*****************/
    NSArray *arr = @[per,per3,per4];
    NSArray *arrNew = [arr valueForKeyPath:@"name"];
    NSLog(@"%@",arrNew);

KVC的部分功能如上,结果就不截图了,因为太多,控制台打印太杂乱,而且只是简单入门的学一下,到时候再深入的学习

KVO这是监听一个属性的变化
比如监听Person这个类这name

Person *per5 = [[Person alloc]init];
per5.name = @"xxx";
/*
addObserver: 监听者
forKeyPath: 监听属性
options:监听方式

*/
[per5 addObserver:per5 forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
per5.name = @"zzz";
/*
这里需要重写observeValueForKeyPath方法,context:是
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    NSLog(@"%@______%@________%@",keyPath,object,change);
}

今天爱国者第四节逆转了夺得今年的超级碗,从未有球队做到在前三节落后19+还能逆转取胜的,真的到处都有奇迹,我觉得我也可以通过不懈的努力逆转自己目前的困境,keep move

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值