1、cell的分割线 与 左右间距设置
-
第一步:首先去除系统自带的分割线,设置分割线的样式separatorStyle为None;
-
方案一:给每个cell的底部添加一个UIView作为分隔线
-
方案二:直接让美工提供一个带分割线效果的背景图片
-
方案三:重写cell的setFrame:方法,让其高度减小
-
使用重写setFrame:方法能够监听所有修改frame的操作,还可以实现让Cell的左右两边存有一定的间距,当然如果你怕用户修改bounds方法监听不到,你还可以重写setBounds:方法,修改x与height
Snip20150906_12.png
-
-
注意:
- 重写系统的setFrame好处,可以监听到所有修改frame的操作
- 应用场合:自定义控件,不希望外界改变尺寸,有个默认宽高100、100,实现方式:重写setFrame:和setBounds:方法,对比initWithFrame修改的好处是,initWithFrame:外界还可以手动修改控件的尺寸,而前者真正办到了屏蔽外界的修改。
- 重写系统的setFrame好处,可以监听到所有修改frame的操作
2、cell点击弹出menu菜单
Snip20151027_5.png方案一:
- 自定义xib,直接让美工提供一个弹出框的背景图片,然后添加对应的按钮在上面,然后,监听点击的区域进行不同的逻辑处理
- 点击Cell时,就弹出上面的自定义的控件到对应的位置即可。
方案二:自己给Cell添加UIMenuController功能
- 苹果自带的有UIMenuController功能,请参照之前的文章,有详
- 1.监听Cell选中事件,弹出菜单,并设置菜单显示内容与frame
- 弹出菜单,相对Cell中间的一条线,显示位置如上图所示:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// 取出cell
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
UIMenuController *menu = [UIMenuController sharedMenuController];
// 设置菜单内容
menu.menuItems = @[
[[UIMenuItem alloc] initWithTitle:@"顶" action:@selector(ding:)],
[[UIMenuItem alloc] initWithTitle:@"回复" action:@selector(reply:)],
[[UIMenuItem alloc] initWithTitle:@"举报" action:@selector(warn:)]
];
// 显示位置 : 参考Cell的左上角,指向Cell中间的一条高1的位置
/*
targetRect:menuController指向的矩形框
targetView:targetRect以targetView的左上角为坐标原点
*/
CGRect rect = CGRectMake(0, cell.height * 0.5, cell.width, 1);
[menu setTargetRect:rect inView:cell];
// 显示出来
[menu setMenuVisible:YES animated:YES];
}
- 2.处理菜单事件
- canPerformAction:方法中,if (!self.isFirstResponder) 分析,判断的理由如下:
- 1.因为,菜单项是针对第一响应者的,现在第一响应者是控制器,所以菜单项是添加到Cell上的,
- 2.但是如果而是文本框成为了第一响应者,那样的话,这些菜单项也会显示到文本框的,但是这些不是我们想要的,所以我们需要判断处理,如果if (!self.isFirstResponder) 就不显示自定义的菜单项
- canPerformAction:方法中,if (!self.isFirstResponder) 分析,判断的理由如下:
#pragma mark - UIMenuController处理
- (BOOL)canBecomeFirstResponder
{
return YES;
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (!self.isFirstResponder) { // 文本框弹出键盘, 文本框才是第一响应者
if (action == @selector(ding:)
|| action == @selector(reply:)
|| action == @selector(warn:)) return NO;
}
return [super canPerformAction:action withSender:sender];
}
- (void)ding:(UIMenuController *)menu
{
JPLog(@"ding - %@ %@",
self.selectedComment.user.username,
self.selectedComment.content);
}
- (void)reply:(UIMenuController *)menu
{
JPLog(@"reply - %@ %@",
self.selectedComment.user.username,
self.selectedComment.content);
}
- (void)warn:(UIMenuController *)menu
{
JPLog(@"warn - %@ %@",
self.selectedComment.user.username,
self.selectedComment.content);
}
3、自定义Cell不等高
3.1 思路分析:
- 1.模型决定cell显示,所有Cell的数据由模型提供,Cell只是展示数据
- 2.某些时候,我们需要将Cell的高度作为模型的一个属性或者Cell的一个属性保存起来,避免重复计算Cell的高度。
- 3.牢记,代理返回Cell的高度的方法先调用,才会调用返回数据源的Cell的方法,所以我们可以在返回计算高度的方法中:根据指定Cell的模型计算出Cell的高度->相当于缓存起来。如何做到缓存?(就是当模型中保存Cell高度的属性<=0时就计算高度后->将高度保存到模型中缓存起来,而且返回计算好的cell的高度,模型中Cell的高度属性>0就表示计算过了不用计算:直接返回高度),所以我们在数据源方法返回Cell,调用返回Cell的高度方法-》返回了计算好的Cell的高度,从而实现了不等高
3.2 实现方案
- 如果比较简单层次结构-》那么使用自动布局就可以解决了
- 如果比较层次结构比较复杂 -》那么能使用自动布局就使用,再不能我们就通过代码和添加约束的方式实现不等高Cell。
网友评论