iOS开发 | 修改tableView的组头悬停位置

iOS开发 | 修改tableView的组头悬停位置,第1张

最近公司商城APP的积分页面改版,有一个细节是tableView是全屏的但是向上滑动时要求组头停靠在导航栏下方。效果大致如下:

做过组头悬停效果的同学应该都知道:如果只设置tableView的style为 UITableViewStylePlain ,不做其它处理,其组头的悬停位置是tableView的最顶部,显然不能满足需求。

用修改tableView的 contentInset 的方式来间接达到修改tableView的组头悬停位置的效果。

GitHub demo

UITableView是app开发中常用到的控件,功能很强大,多用于数据的显示。

初始化tableview后,要想显示数据,就必须遵守tableview的数据源代理,而且实现以下方法否则程序会崩溃:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

该方法决定了tableview的每一行显示什么内容,返回值为UITableViewCell,可以通过设置UITableViewCell的各种属性(image,label..)从而达到想要的效果,或者自定义Cell,关于自定义cell在后面会做相关介绍

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

该方法决定了每一组(section)中有几个cell

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

该方法决定了tabview显示几组,这个方法不一定要实现,如果不实现默认显示一组

如果想要实现对tableview 的 *** 作(如:点击每一个cell能获得相应)则必须遵守UITableViewDelegate协议,成为代理

以下是几个比较常用的方法

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

该方法可以设置每个cell 的高度

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

该方法可以自定义每个组的头部(图片,按钮等等)

- (nullable UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section

该方法可以自定义每个组的尾部(图片,按钮等等)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

该方法获取当前点击的cell的indexPath(结构体,包括了section和row)

如何复制粘贴剪切一个cell

遵守UITableViewDelegate协议,并实现以下方法

该方法决定在长按cell后 是否显示 复制粘贴 菜单

-(BOOL)collectionView:(UICollectionView *)collectionView shouldShowMenuForItemAtIndexPath:(NSIndexPath *)indexPath{

return YES

}

该方法决定 菜单上显示什么按钮

-(BOOL)collectionView:(UICollectionView *)collectionView canPerformAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender{

//    不显示剪切的按钮

if (action==@selector(copy:)||action==@selector(paste:)) {

return YES

}else{

return NO

}

}

该方法决定 点击菜单上的复制粘贴按钮 后干啥

-(void)collectionView:(UICollectionView *)collectionView performAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender{

if (action==@selector(copy:)) {

       NSLog(@"copy!")

}else if(action==@selector(paste:)){

       NSLog(@"paste!")

cell 的编辑

设置cell能否被编辑

-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{

return YES

}

设置删除按钮的文字

-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{

return @"删除"

}

实现cell 的编辑,通过editingStyle做不同 *** 作

editingStyle:是编辑模式是枚举类型,有以下三种

UITableViewCellEditingStyleNone,

UITableViewCellEditingStyleDelete,

UITableViewCellEditingStyleInsert

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

  }

UITableViewCell的使用

创建TableViewCell

UITableViewCell *cell=[UITableViewCell alloc]initWithStyle:<#(UITableViewCellStyle)#>reuseIdentifier:<#(nullable NSString *)#>]

reuseIdentifier:重用标识符,定义重用标识符可以实现cell的复用、

TableViewCell的重用:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"newscell"]

//复用重用标识符为newscell的cell

if (cell == nil) {

//没有重用标识符为newsreel的cell 创建一个cell并且设置重用标识符

cell=[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"newsreel"]

}

//注册tableviewcell,这样就不需要对cell进行为空判断

[tableView registerClass:<#(nullable Class)#>forCellReuseIdentifier:<#(nonnull NSString *)#>]

//使用xib创建cell,使用下面的方法进行tableviewcell的注册

[tableView registerNib:<#(nullable UINib *)#>forCellReuseIdentifier:<#(nonnull NSString *)#>]

MJViewController.h

#import UIKit.h>

@interface MJViewController : UIViewController

@end

MJViewController.m

#import "MJViewController.h"

// 省份字典用key

#define kHeader @"header" // 部标题应key

#define kFooter @"footer" // 尾部标题应key

#define kCities @"cities" // 城市数组应key

@interface MJViewController ()

{

// NSArray *_allCities// 所城市

NSArray *_allProvinces// 所省份

}

@end

@implementation MJViewController

- (void)viewDidLoad

{

[super viewDidLoad]

// 1.添加tableView

UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped]

tableView.dataSource = self

[self.view addSubview:tableView]

// 2.初始化数据

_allProvinces = @[

@{

kHeader : @"广东",

kFooter : @"广东",

kCities : @[@"广州", @"深圳", @"梅州"]

},

@{

kHeader : @"湖南",

kFooter : @"湖南",

kCities : @[@"沙", @"益阳"]

},

@{

kHeader : @"湖北",

kFooter : @"湖北更",

kCities : @[@"武汉", @"黄冈"]

}

]

// _allCities = @[

// ,

// ,

// @[@"武汉", @"黄冈"],

// @[@"桂林", @"玉林"],

// @[@"杭州", @"温州"],

// @[@"合肥", @"安庆"]

// ]

}

#pragma mark - 数据源

#pragma mark 共少组(section == 区域\组)

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{

return _allProvinces.count

}

#pragma mark 第section组共少行

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

// 1.取第section组省份

NSDictionary *province = _allProvinces[section]

// 2.取省份面城市数组

NSArray *cities = province[kCities]

return cities.count

// // 1.取第section组所城市

// NSArray *sectionCities = _allCities[section]

//

// // 2.第section组城市数

// return sectionCities.count

}

#pragma mark 返每行显示内容(每行显示cell)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]

// NSString *text = _allCities[indexPath.section][indexPath.row]

// NSArray *sectionCities = _allCities[indexPath.section]

// 1.取第section组第row行文字数据

// 取第section组省份 城市数组面 第 row行 数据

NSDictionary *province = _allProvinces[indexPath.section]

NSArray *cities = province[kCities]

NSString *text = cities[indexPath.row]

// 2.展示文字数据

cell.textLabel.text = text

return cell

}

#pragma mark 第section组显示部标题

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

{

// if (section == 0) return @"广东"

// if (section == 1) return @"湖南"

// if (section == 2) return @"湖北"

// if (section == 3) return @"广西"

// if (section == 4) return @"浙江"

// if (section == 5) return @"安徽"

NSDictionary *province = _allProvinces[section]

return province[kHeader]

}

#pragma mark 第section组显示尾部标题

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section

{

// if (section == 0) return @"广东"

// if (section == 1) return @"湖南"

// if (section == 2) return @"湖北更"

// if (section == 3) return @"广西般般"

// if (section == 4) return @"浙江应该吧"

// if (section == 5) return @"安徽确实点坑爹"

return _allProvinces[section][kFooter]

}

@end

-


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11244895.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存