博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用TableView写带特效的cell
阅读量:5145 次
发布时间:2019-06-13

本文共 4767 字,大约阅读时间需要 15 分钟。

用TableView写带特效的cell

效果:

源码地址:

分析:

在UIScrollView中的代理中发送广播,然后在cell中接收广播

对每一个cell进行设置

对开发有利的一种小细节:

 

核心源码:

控制器源码

////  ViewController.m//  TableView////  Created by XianMingYou on 15/4/9.//  Copyright (c) 2015年 XianMingYou. All rights reserved.//#import "ViewController.h"#import "DataCell.h"@interface ViewController ()
@property (nonatomic, strong) UITableView *tableView;@property (nonatomic, strong) NSArray *dataSource;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; // 数据源 self.dataSource = @[@"YouXianMing", @"Google", @"iOS Developer", @"Android Developer", @"YouTube", @"UI Delveloper", @"PS4 Player", @"XboxOne Player"]; // 初始化tableView self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; self.tableView.delegate = self; self.tableView.dataSource = self; self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; [self.tableView registerClass:[DataCell class] forCellReuseIdentifier:DATA_CELL]; [self.view addSubview:self.tableView];}- (void)scrollViewDidScroll:(UIScrollView *)scrollView { // 发送广播 [[NSNotificationCenter defaultCenter] postNotificationName:DATA_CELL object:@(scrollView.contentOffset.y) userInfo:nil];}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.dataSource.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { DataCell *cell = [tableView dequeueReusableCellWithIdentifier:DATA_CELL]; cell.indexPath = indexPath; cell.label.text = self.dataSource[indexPath.row]; return cell;}- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return CELL_HEIGHT;}@end

cell源码

////  DataCell.h//  TableView////  Created by XianMingYou on 15/4/9.//  Copyright (c) 2015年 XianMingYou. All rights reserved.//#import 
#define DATA_CELL @"DataCell"#define CELL_HEIGHT (56.8f * 2)@interface DataCell : UITableViewCell@property (nonatomic, strong) NSIndexPath *indexPath;@property (nonatomic, strong) UILabel *label;@end
////  DataCell.m//  TableView////  Created by XianMingYou on 15/4/9.//  Copyright (c) 2015年 XianMingYou. All rights reserved.//#import "DataCell.h"#import "UIView+SetRect.h"@interface DataCell ()@property (nonatomic, strong) UIView *blackView;@end@implementation DataCell- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {                self.selectionStyle  = UITableViewCellSelectionStyleNone;                // 注册通知中心        [[NSNotificationCenter defaultCenter] addObserver:self                                                 selector:@selector(notificationEvent:)                                                     name:DATA_CELL                                                   object:nil];                // 构建子控件        [self buildViews];    }        return self;}- (void)buildViews {    self.label      = [[UILabel alloc] initWithFrame:CGRectMake(30, 0, 300, CELL_HEIGHT)];    self.label.font = [UIFont fontWithName:@"Avenir-BookOblique" size:30.f];    [self addSubview:self.label];        self.blackView = [[UIView alloc] initWithFrame:CGRectMake(10 + 50, 80, 150, 2)];    self.blackView.backgroundColor = [UIColor blackColor];    [self addSubview:self.blackView];}- (void)notificationEvent:(id)sender {        NSDictionary *data    = sender;    CGFloat       offsetY = [[data valueForKey:@"object"] floatValue] - self.indexPath.row * CELL_HEIGHT;        if (offsetY >= 0 && offsetY <= CELL_HEIGHT) {        // 根据百分比计算        CGFloat percent  = 1 - offsetY / CELL_HEIGHT;                // 设置值        self.label.alpha = percent;        self.blackView.x = 10 + percent * 50;            } else if (offsetY >= - CELL_HEIGHT * 5 && offsetY <= - CELL_HEIGHT * 4) {        // 根据百分比计算        CGFloat percent  = (offsetY + CELL_HEIGHT) / CELL_HEIGHT + 4;                // 设置值        self.label.alpha = percent;        self.blackView.x = 10 + 50 + (1 - percent) * 50;    } else {        // 复位        self.label.alpha = 1.f;        self.blackView.x = 10 + 50;    }}- (void)dealloc {    // 移除通知中心    [[NSNotificationCenter defaultCenter] removeObserver:self                                                    name:DATA_CELL                                                  object:nil];}@end

 

转载于:https://www.cnblogs.com/YouXianMing/p/4409238.html

你可能感兴趣的文章
判断线段是否相交
查看>>
Codeforces Round #277 (Div. 2)
查看>>
一步步学Mybatis-搭建最简单的开发环境-开篇(1)
查看>>
微信小程序图片上传
查看>>
【更新】智能手机批量添加联系人
查看>>
NYOJ-128前缀式计算
查看>>
centos6.7 配置外网端口映射
查看>>
红外通信基础(含代码)
查看>>
淡定,啊。数据唯一性
查看>>
java并发编程之lock锁
查看>>
深入理解 JavaScript 事件循环(一)— event loop
查看>>
Hive(7)-基本查询语句
查看>>
常用第三方(分享,支付,二维码,语音,推送)
查看>>
Redis快速入门
查看>>
动态绑定时的显示隐藏控制
查看>>
注意java的对象引用
查看>>
C++ 面向对象 类成员函数this指针
查看>>
inline函数的总结
查看>>
SPSS-生存分析
查看>>
【Jquery】$.Deferred 对象
查看>>