iOS tableViewCell侧滑改变收藏状态
/**
* 图片素材 链接: http://pan.baidu.com/s/1mhi1sfQ 密码: w2wq
*/
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @end
#import "AppDelegate.h"
#import "RootViewController.h"
@interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor]; UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:[[RootViewController alloc] init]];
self.window.rootViewController = navi; [self.window makeKeyAndVisible];
return YES;
} @end
#import <UIKit/UIKit.h> @interface RootViewController : UIViewController @end
#import "RootViewController.h"
#import "LFCustomCell.h"
@interface RootViewController ()<UITableViewDataSource,UITableViewDelegate,LFCustomCellDelegate>
{
UITableView *_tableView;
NSMutableArray *staues;
}
@end @implementation RootViewController - (void)loadView{
[super loadView];
_tableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] bounds] style:UITableViewStylePlain];
_tableView.dataSource = self;
_tableView.delegate = self;
_tableView.tableFooterView = [[UIView alloc] init];
[self.view addSubview:_tableView];
} - (void)viewDidLoad {
[super viewDidLoad];
self.title = @"侧滑收藏"; for (int i = ; i < ; i++) {
if (!staues) {
staues = [[NSMutableArray alloc] init];
}
[staues addObject:@];//0代表未收藏,1代表已收藏
} } #pragma mark -- UITableViewDataSource --
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return ;
} - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return ;
} - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *identifier = @"customCell";
LFCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (!cell) {
cell = [[LFCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
cell.delegate = self;
}
cell.contentLabel.text = [NSString stringWithFormat:@"测试的cell 编号:%ld",indexPath.row];
cell.isCollected = [staues[indexPath.row] intValue];
cell.indexPath = indexPath;
return cell;
}
#pragma mark -- LFCustomCellDelegate --
- (void)processDataWithIndexPath:(NSIndexPath *)indexPath andStatue:(int)statue{
NSLog(@"indexPath:%@ , statue:%d",indexPath,statue);
[staues replaceObjectAtIndex:indexPath.row withObject:[NSNumber numberWithInt:statue]];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end
#import <UIKit/UIKit.h> @protocol LFCustomCellDelegate <NSObject> - (void)processDataWithIndexPath:(NSIndexPath*)indexPath andStatue:(int)statue; @end @interface LFCustomCell : UITableViewCell @property(nonatomic, weak) id<LFCustomCellDelegate> delegate; @property(nonatomic, strong) UILabel *contentLabel;
@property(nonatomic, strong) UIImageView *statueView;
@property(nonatomic, assign) int isCollected;
@property(nonatomic, strong) NSIndexPath *indexPath; @end
#import "LFCustomCell.h"
#define CELL_WIDTH [UIScreen mainScreen].bounds.size.width
const float animateDuration = 0.3;
const double statueViewWidth = ;
@interface LFCustomCell ()<UIGestureRecognizerDelegate> @property (nonatomic, assign) BOOL isLeft; @end
@implementation LFCustomCell
- (void)awakeFromNib {
// Initialization code
} - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated]; // Configure the view for the selected state
} - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
self.backgroundColor = [UIColor orangeColor];
self.selectionStyle = UITableViewCellSelectionStyleNone;
self.isLeft = YES;
[self addSubview:self.contentLabel];
[self addSubview:self.statueView];
}
return self;
}
/**
* 初始化_contentLabel
*/
- (UILabel *)contentLabel{
if (!_contentLabel) {
_contentLabel = [[UILabel alloc] init];
_contentLabel.backgroundColor = [UIColor whiteColor];
_contentLabel.userInteractionEnabled = YES;
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureAction:)];
pan.delegate = self;
[_contentLabel addGestureRecognizer:pan];
}
return _contentLabel;
}
/**
* 初始化_statueView
*/
- (UIImageView *)statueView{
if (!_statueView) {
_statueView = [[UIImageView alloc] init];
}
return _statueView;
} - (void)panGestureAction:(UIPanGestureRecognizer*)sender{
CGPoint translation = [sender translationInView:self]; switch (sender.state) {
case UIGestureRecognizerStateBegan:
break;
case UIGestureRecognizerStateChanged:
//当垂直拖拽时,不执行方法
if (fabs(translation.x)<fabs(translation.y)) {
return;
}
//向左滑动时,移动_contentLabel;向右滑动时,直接返回
if (translation.x < ) {
if (fabs(translation.x)<CELL_WIDTH/2.0) {
CGRect frame = _contentLabel.frame;
frame.origin.x = translation.x;
_contentLabel.frame = frame;
CGRect otherFrame = _statueView.frame;
otherFrame.origin.x = CGRectGetMaxX(_contentLabel.frame);
_statueView.frame = otherFrame;
}
if ((fabs(translation.x) > (CELL_WIDTH/2.0-)) && (self.isLeft == YES)) {
[self changeCollectionStatue];
self.isLeft = NO;
}
}else{
return;
}
break;
default:
[UILabel animateWithDuration:animateDuration animations:^{
_contentLabel.frame = self.bounds;
_statueView.frame = CGRectMake(CGRectGetMaxX(self.contentLabel.frame), , statueViewWidth, self.bounds.size.height);
} completion:^(BOOL finished) {
self.isLeft = YES;
}];
break;
}
} - (void)layoutSubviews{
self.contentLabel.frame = self.bounds;
self.statueView.frame = CGRectMake(CGRectGetMaxX(self.contentLabel.frame), , statueViewWidth, self.bounds.size.height);
if (self.isCollected) {
_statueView.image = [UIImage imageNamed:@"isCollect"];
}else{
_statueView.image = [UIImage imageNamed:@"noCollected"];
}
} - (void)changeCollectionStatue{
if (self.isCollected) {
_statueView.image = [UIImage imageNamed:@"cancleCollect"];
self.isCollected = ;
}else{
_statueView.image = [UIImage imageNamed:@"isCollect"];
self.isCollected = ;
}
if ([_delegate respondsToSelector:@selector(processDataWithIndexPath:andStatue:)]) {
[_delegate processDataWithIndexPath:self.indexPath andStatue:self.isCollected];
}
}
#pragma mark -- UIGestureRecognizerDelegate --
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
return YES;
} @end
iOS tableViewCell侧滑改变收藏状态的更多相关文章
- iOS开发网络篇—监测网络状态(转)
文章转载自:http://www.cnblogs.com/wendingding/p/3950114.html iOS开发网络篇—监测网络状态 一.说明 在网络应用中,需要对用户设备的网络状态进行实时 ...
- iOS开发网络篇—监测网络状态
iOS开发网络篇—监测网络状态 一.说明 在网络应用中,需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行 ...
- devexpress中gridview控件编辑时改变输入法状态
在win7环境下使用Devexpress中的SpinEdit控件,切换成中文[简/繁]输入法输入数字键时有不少输入法会重复产生数字如输入1会变成11,输入123会变成112233.使用SpinEdit ...
- iOS 开发网络篇—监测网络状态
iOS开发网络篇—监测网络状态 一.说明 在网络应用中,需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行 ...
- Android之怎样改变焦点状态【EditText】
以EditText为例 1.改变焦点状态 password.setOnFocusChangeListener(new OnFocusChangeListener() { @Override publi ...
- 2016年GitHub 排名前 100 的安卓、iOS项目简介(收藏)
排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者 ...
- WPF 后台数据触发改变界面状态-心跳实现
今年做的一个上位机工控WPF项目,做个小小的总结把,以后随时来找 请不要带血乱喷,我只是菜鸟.___by 鲍队 类似于这样子的;大致的意思是:一个代码变量,通过改变变量的值,绑定这个变量的这个圆颜色也 ...
- iOS - 在工程中试玩状态模式
做了一个项目,项目中一个藏品详情界面针对不同用户,和用户所处于的状态的不同,展示的效果和操作的权限都会不同.想到了状态模式,从来没有用过,赶紧学一下然后用一用.期待兴奋 看了这么多的博客,终于找到一个 ...
- IOS中设置状态栏的状态
IOS上 关于状态栏的相关设置(UIStatusBar) 知识普及 ios上状态栏 就是指的最上面的20像素高的部分 状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时 ...
随机推荐
- 【ZZ】 DShader之位移贴图(Displacement Mapping)
http://www.myexception.cn/other/1397638.html DShader之位移贴图(Displacement Mapping) www.MyException.Cn ...
- 一个项目软件的大小基本都占用在外部引用的jar包上了。
1.一个项目几百兆,基本都是外部jar包,引用的. 2.自己本身业务代码并没有那么多的 3.看下meven的仓库大小就知道了,都几百兆
- MVC validation
<div class="editor-field"> @Html.TextBoxFor(m => m.DateField) @Html.ValidationMes ...
- mysql线程缓存和表缓存
一.线程缓存1.thread_cache_size定义了线程缓冲中的数量.每个缓存中的线程通常消耗256kb内存2.Threads_cached,可以看到已经建立的线程二.表缓存(table_cach ...
- 打造 PHP版本 1password
以前注册很多网站密码都使用简单密码,但是由于今年频繁曝出密码不安全问题,所以要使用更加复杂的密码.但是好多个账号,密码也不能设置成一样的,防止一个被盗全部不安全了,记密码就成了意见很头疼的事情. 在手 ...
- bootstrap响应式实用工具
- Fedora 11中用MinGW编译Windows的Qt4程序(在Linux系统下编译Windows的程序)
Ubuntu下可以直接安装: sudo apt-get install mingw32 mingw32-binutils mingw32-runtime 安装后编译程序可以: i586-mingw32 ...
- Moogoose操作之Schema实现增删查改
Schema不仅定义了文档结构和使用性能,可以为后面的Model和Entity提供公共的属性和方法. Schema.Model.Entity的关系: Schema : 可以定义字段类型,不具备数据库的 ...
- hadoop MapReduce 工作机制
摸索了将近一个月的hadoop , 在centos上配了一个伪分布式的环境,又折腾了一把hadoop eclipse plugin,最后终于实现了在windows上编写MapReduce程序,在cen ...
- iOS面试题01
1.#import和#include.@class有什么区别?#import<>和#import“”又有什么区别? 答:1.#import和#include都能完整地包含某个文件的内容,# ...