• 使用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];
        });
    

    效果例如以下:

    这里写图片描写叙述

  • 相关阅读:
    python 中文文档地址总结
    清除celery 任务队列
    celery work logging 问题
    mysql 数据库 存储数据类型
    python 补0的方法
    lunix 命令积累
    python3 import Crypto 失败的解决办法 (AES对称加密使用 模块)
    从excel 获取内容 模块:xlrd
    api h5 sdk 接入的说明
    Excel 打开两个单独的页面
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7235769.html
Copyright © 2020-2023  润新知