zoukankan      html  css  js  c++  java
  • 使用FDTemplateLayout框架打造个性App

    效果展示

    project下载地址

    这里写图片描写叙述

    ·

    这里写图片描写叙述

    进入构建结构

    首先我们新建一个project

    这里写图片描写叙述

    接下来我们拖进来一个Table View Controller,将Storyboard Entry Point指向我们的Table View Controller。

    原来的ViewController就能够删除了。

    效果如图所看到的

    这里写图片描写叙述

    这里写图片描写叙述

    选中Table View Controller,点击上面菜单条中Editor->Embed in->Navigation Controller

    这里写图片描写叙述

    这里写图片描写叙述

    主要的工作我们都做完了。能够讲project中无用的东西都能够删除了,方便我们进行编写东西

    这里写图片描写叙述

    主题(代码编写)

    在这里我进行代码的编写,讲述主要部分,后面会把完整的项目给出

    构建LDEntity用来初始化字典,进行Json数据的解析

    LDEntity.h

    #import <Foundation/Foundation.h>
    
    @interface FDFeedEntity : NSObject
    
    - (instancetype)initWithDictionary:(NSDictionary *)dictionary;
    
    @property (nonatomic, copy) NSString *title;
    @property (nonatomic, copy) NSString *content;
    @property (nonatomic, copy) NSString *username;
    @property (nonatomic, copy) NSString *time;
    @property (nonatomic, copy) NSString *imageName;
    
    @end
    

    -(instancetype)initWithDictionary:(NSDictionary *)dictionary方法的详细实现,返回本身类型

    LDEntity.m

    #import "FDFeedEntity.h"
    
    @implementation FDFeedEntity
    
    - (instancetype)initWithDictionary:(NSDictionary *)dictionary
    {
        self = super.init;
        if (self) {
            self.title = dictionary[@"title"];
            self.content = dictionary[@"content"];
            self.username = dictionary[@"username"];
            self.time = dictionary[@"time"];
            self.imageName = dictionary[@"imageName"];
        }
        return self;
    }
    
    @end
    

    以上代码的功能主要是为了解析JSON数据

    构建我们的Main.storyboard

    选中Table View更改Style为Grouped

    这里写图片描写叙述

    设计出以下样式,而且使用 auto layout进行约束

    这里写图片描写叙述

    接下来编写cell

    新建LDCell 继承 UITableViewCell

    这里写图片描写叙述

    将Main.storyboard中TableView中的Cell的Identifier设置为LDCell,而且关联LDCell

    这里写图片描写叙述

    LDCell.h

    构建一个LDEntity对象解析数据

    #import <UIKit/UIKit.h>
    #import "LDEntity.h"
    
    @interface LDCell : UITableViewCell
    
    @property(nonatomic,strong)LDEntity *entity;
    
    @end
    

    将刚才的全部控件与LDCell.m关联

    这里写图片描写叙述

    在LDCell.m中构建entity的set方法,还有须要注意的是假设你没有使用auto layout,你须要重写约束方法

    LDCell.m

    #import "LDCell.h"
    
    @interface LDCell ()
    @property (weak, nonatomic) IBOutlet UILabel *titleLabel;
    @property (weak, nonatomic) IBOutlet UILabel *contentLabel;
    @property (weak, nonatomic) IBOutlet UIImageView *contentImageView;
    @property (weak, nonatomic) IBOutlet UILabel *usernameLabel;
    @property (weak, nonatomic) IBOutlet UILabel *timeLabel;
    
    @end
    
    @implementation LDCell
    
    - (void)awakeFromNib {
        // 修复IOS7中的BUG- 初始化 constraints warning
    
        self.contentView.bounds = [UIScreen mainScreen].bounds;
    }
    
    //关联控件进行数据显示
    -(void)setEntity:(LDEntity *)entity{
        _entity = entity;
    
        self.titleLabel.text = entity.title;
        self.contentLabel.text = entity.content;
        self.contentImageView.image = entity.imageName.length > 0 ?

    [UIImage imageNamed:entity.imageName] : nil; self.usernameLabel.text = entity.username; self.timeLabel.text = entity.time; } #if 0 // 假设没有使用 auto layout, 请重写这种方法 - (CGSize)sizeThatFits:(CGSize)size { CGFloat totalHeight = 0; totalHeight += [self.titleLabel sizeThatFits:size].height; totalHeight += [self.contentLabel sizeThatFits:size].height; totalHeight += [self.contentImageView sizeThatFits:size].height; totalHeight += [self.usernameLabel sizeThatFits:size].height; totalHeight += 40; // margins return CGSizeMake(size.width, totalHeight); } #endif @end

    開始编写我们最重要的类LDViewController.在编写这个类之前。我们须要使用FDTemplateLayout
    ,而且将TableViewController与LDViewController进行关联

    LDViewController.h

    #import <UIKit/UIKit.h>
    
    @interface FDFeedViewController : UITableViewController
    
    @end
    

    TableView的使用有不明确的能够去学习下,这里不做解释了。凝视中给出了重点的地方解说,设置data source以及设置Delegate在程序中做出区分

    LDViewController.m

    
    #import "LDViewController.h"
    #import "UITableView+FDTemplateLayoutCell.h"
    #import "LDEntity.h"
    #import "LDCell.h"
    
    @interface LDViewController ()<UIActionSheetDelegate>
    
    @property (nonatomic, copy) NSArray *prototypeEntitiesFromJSON;
    @property (nonatomic, strong) NSMutableArray *feedEntitySections; // 2d array
    @property (nonatomic, assign) BOOL cellHeightCacheEnabled;
    
    @end
    
    @implementation LDViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.tableView.estimatedRowHeight = 200;
        self.tableView.fd_debugLogEnabled = YES;
    
        self.cellHeightCacheEnabled = YES;
    
        [self buildTestDataThen:^{
            self.feedEntitySections = @[].mutableCopy;
            [self.feedEntitySections addObject:self.prototypeEntitiesFromJSON.mutableCopy];
            [self.tableView reloadData];
        }];
    }
    
    - (void)buildTestDataThen:(void (^)(void))then
    {
        // 模拟一个异步请求
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    
            // 读取数据从 `data.json`
            NSString *dataFilePath = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"json"];
            NSData *data = [NSData dataWithContentsOfFile:dataFilePath];
            NSDictionary *rootDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
            NSArray *feedDicts = rootDict[@"feed"];
    
            // 讲数据转化为 `LDEntity`
            NSMutableArray *entities = @[].mutableCopy;
            [feedDicts enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
                [entities addObject:[[LDEntity alloc] initWithDictionary:obj]];
            }];
            self.prototypeEntitiesFromJSON = entities;
    
            // 重返
            dispatch_async(dispatch_get_main_queue(), ^{
                !then ?: then();
            });
        });
    }
    
    //设置数据源
    #pragma mark - Table view data source
    
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return self.feedEntitySections.count;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [self.feedEntitySections[section] count];
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        //LDCell为Main.storyboard中的cell控件
        LDCell *cell = [tableView dequeueReusableCellWithIdentifier:@"LDCell" forIndexPath:indexPath];
        [self configureCell:cell atIndexPath:indexPath];
        return cell;
    }
    
    - (void)configureCell:(LDCell *)cell atIndexPath:(NSIndexPath *)indexPath
    {
        cell.fd_enforceFrameLayout = NO; // Enable to use "-sizeThatFits:"
        if (indexPath.row % 2 == 0) {
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        } else {
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        }
        cell.entity = self.feedEntitySections[indexPath.section][indexPath.row];
    }
    
    
    
    //设置托付
    #pragma mark - UITableViewDelegate
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (self.cellHeightCacheEnabled) {
    
            //LDCell为Main.storyboard中的cell控件
    
            return [tableView fd_heightForCellWithIdentifier:@"LDCell" cacheByIndexPath:indexPath configuration:^(LDCell *cell) {
                [self configureCell:cell atIndexPath:indexPath];
            }];
        } else {
            return [tableView fd_heightForCellWithIdentifier:@"LDCell" configuration:^(LDCell *cell) {
                [self configureCell:cell atIndexPath:indexPath];
            }];
        }
    }
    
    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (editingStyle == UITableViewCellEditingStyleDelete) {
            NSMutableArray *mutableEntities = self.feedEntitySections[indexPath.section];
            [mutableEntities removeObjectAtIndex:indexPath.row];
            [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
        }
    }
    
    
    @end
    

    假设你想有自己的cell,你能够这么做:

    
    #import "UITableView+FDTemplateLayoutCell.h"
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return [tableView fd_heightForCellWithIdentifier:@"reuse identifer" configuration:^(id cell) {
            // 配置此Cell(单元格)的数据, 同你在"-tableView:cellForRowAtIndexPath:"做了什么一样
            // 像这样:
            //    cell.entity = self.feedEntities[indexPath.row];
        }];
    }
    

    以下制作我们的最后一个功能就是下拉刷新操作

    我们使用UITableViewController自带的UIRefreshControl

    在LDViewController.m中加入此方法,而且与UIRefreshControl关联

    //又一次载入数据
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [self.feedEntitySections removeAllObjects];
            [self.feedEntitySections addObject:self.prototypeEntitiesFromJSON.mutableCopy];
            [self.tableView reloadData];
            [sender endRefreshing];
        });
    

    效果例如以下:

    这里写图片描写叙述

  • 相关阅读:
    线程系列2---线程同步
    off() 方法 与 unbind() 方法移除绑定事件的处理程序。one()函数用于为每个匹配元素的一个或多个事件绑定一次性事件处理函数
    animation css3动画与CSS3 @keyframes担配使用创建往复平缓动画
    querySelector 和 querySelectorAll 的使用
    js实现浏览器兼容复制功能
    evaluateScript--evaluatePopoverScript--区别
    appcan 跨窗口处理方法 appcan.window.evaluateScript({name,scriptContent,type})使用解读
    条件注释判断浏览器<!--[if !IE]><!--[if IE]><!--[if lt IE 6]><!--[if gte IE 6]>
    stop() 是用于停止动画 :animated 用于判断动画是否在进行中
    CSS3的calc()使用
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7235769.html
Copyright © 2011-2022 走看看