UITableView设置Section间距

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UITableView设置Section间距相关的知识,希望对你有一定的参考价值。

参考技术A 在使用ios的UITableView时,时常会用到它的UITableViewStyleGrouped分组多section属性。而默认的情况下使用该属性后section之间的间距会比较大,看着很不舒服。那么可以通过以下的代理方法配置UITableView各个section的间距。
原理其实很简单,显示效果的各个section间距其实是section头部和底部的组合。配置他们的间距就是配置各个section的头部和底部。具体如下示例:

<pre>
//section头部间距

原文地址

UITableview Section View 上的 UIbutton 没有动画

【中文标题】UITableview Section View 上的 UIbutton 没有动画【英文标题】:UIbutton on UITableview Section View doesn't animate 【发布时间】:2013-05-05 10:52:24 【问题描述】:

我正在开发一个包含主要类别和子类别的表格视图。基本上主要类别是表格视图部分标题,当用户单击表格视图部分标题中的按钮时,我将我的表格视图设置为在表格视图中显示这些子类别(行)。

一切都很好,但我想要做的是当用户点击部分标题中的“显示子类别按钮”时,我希望该按钮设置动画并旋转 90 度。该按钮是 UIButtonTypeDetailDisclosure 类型,所以我猜你得到了我想要的。

当我将动画代码添加到我的“viewForHeaderInSection”委托方法时,动画可以工作,但从外部无法正常工作。奇怪的是,点击动作也在起作用。下面是代码(为了清楚起见,用户也可以点击一个主类别,用手势识别器显示该类别中的所有内容):

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

MainCategory* cat = [self.tableViewArray objectAtIndex:section];

UIView* view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 44)];
UILabel* label = [[UILabel alloc]initWithFrame:CGRectMake(55, 0, 300, 44)];
UIView* imageView = [[UIView alloc]initWithFrame:CGRectMake(2, 2, 40, 40)];
imageView.backgroundColor = [UIColor darkGrayColor];
view.backgroundColor = [UIColor lightTextColor];
label.text = cat.name;
label.backgroundColor = [UIColor clearColor];
[view addSubview:label];
[view addSubview:imageView];
UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(selectMainCategory:)];
[view addGestureRecognizer:tapGesture];
view.tag = section;
if([cat.subcategories count]>0)
    UIButton* button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    button.frame = CGRectMake(200, 0, 44, 44);
    button.tag = section;
    [button addTarget:self action:@selector(subCategoryClick:) forControlEvents:UIControlEventTouchUpInside];
    [view addSubview:button];

return view;

对于我的按钮点击操作:

- (IBAction)subCategoryClick:(UIButton*)sender

    NSLog(@"click!");
    MainCategory* cat = [tableViewArray objectAtIndex:sender.tag];
    NSNumber* section = [NSNumber numberWithInt:sender.tag];
    if(![openSections containsObject:section])
        [openSections addObject:section];


        NSMutableArray* indexPathsToAdd = [NSMutableArray array];
        for(int i = 0;i<[cat.subcategories count];i++)
            [indexPathsToAdd addObject:[NSIndexPath indexPathForRow:i inSection:sender.tag]];
        
        [self.tableView beginUpdates];
        [self.tableView insertRowsAtIndexPaths:indexPathsToAdd withRowAnimation:UITableViewRowAnimationAutomatic];
        [self.tableView endUpdates];
        [self rotateButton:sender isOpeningSection:YES];

    else
        [openSections removeObject:section];

        NSMutableArray* indexPathsToRemove = [NSMutableArray array];
        for(int i = 0;i<[cat.subcategories count];i++)
            [indexPathsToRemove addObject:[NSIndexPath indexPathForRow:i inSection:sender.tag]];
        
        [self.tableView beginUpdates];
        [self.tableView deleteRowsAtIndexPaths:indexPathsToRemove withRowAnimation:UITableViewRowAnimationAutomatic];
        [self.tableView endUpdates];

        [self rotateButton:sender isOpeningSection:NO];
    
    [self.tableView reloadData];

最后,我的动画方法(只是看它是否动画,不是最终方法):

- (void)rotateButton:(UIButton*)button isOpeningSection:(BOOL)isOpen
    CABasicAnimation *halfTurn;
    halfTurn = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
    halfTurn.fromValue = [NSNumber numberWithFloat:0];
    halfTurn.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)];
    halfTurn.duration = 0.5;
    halfTurn.repeatCount = HUGE_VALF;
    [[button layer] addAnimation:halfTurn forKey:@"180"];

正如我所说,当我将 rotatebutton 内容添加到 viewForSection 方法时,按钮正在旋转,但从 lick 事件调用时它不会旋转。我想我在这个方法中定位错误的按钮层..

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我猜想对reloadData 的调用会强制表视图从tableView:viewForHeaderInSection: 创建一个新视图,这会立即从视图层次结构中删除旧视图并添加未旋转的视图。

可能的解决方案:

如果您已经在insertRowsAtIndexPathsdeleteRowsAtIndexPaths 中制作动画,您是否需要调用reloadData?除了旋转动画之外,它很可能会破坏这些动画。

您可以提前创建您的部分标题(也许在viewDidLoad 中),然后在tableView:viewForHeaderInSection: 中返回引用。这将在您调用 reloadData 时保持所有动画不变。

【讨论】:

不知道我在使用 insertrows 或 deleterows 时不需要重新加载数据。我想知道为什么我的动画表现得很奇怪哈哈谢谢【参考方案2】:

360*PI/180 = 2PI。那是360度。使用 M_PI/2。

【讨论】:

感谢您的回答,但旋转度只是为了测试,主要问题是调用“rotatebutton”方法时动画不适用于按钮。 嗯是不是因为你在click方法中调用了reloadData?这将调用 viewForHeader 来创建一个新按钮!动画发生在旧版本中

以上是关于UITableView设置Section间距的主要内容,如果未能解决你的问题,请参考以下文章

xcode7中可以改变uitableview分组表格之间的距离吗

iOS8中 UITableView section 分区头部视图不显示

iOS11section间距大的问题

如何禁止UITableView的section停留(去除卡住的效果)

如何禁止UITableView的section停留(去除卡住的效果)

UITableView 检测section header的停靠和脱离