在表格 tableview初始化的时候我们可以指定需要使用的 UITableViewStyle样式,可用的样式一共有两种:.plain和 .grouped。下面分别对它们做介绍。

一、plain模式

1,默认样式

在 plain模式下,如果 tableview有多个 section(分区、分组),组与组之间默认是没有间距的。

同时组头或组尾会有 sticky效果(粘性效果、悬停效果),即表格滚动时组头与组尾会自动停留,而不是跟随单元格一同移动。

import UIKit

class ViewController: UIViewController , UITableViewDelegate, UITableViewDataSource{

var tableView:UITableView?

//分组头标题

var articleHeaders:[String]!

//所有文章标题

var articleNames:Dictionary!

override func loadView() {

super.loadView()

}

override func viewDidLoad() {

super.viewDidLoad()

//初始化数据

self.articleNames = [

0:[String]([

"1、文本标签(UILabel)的用法",

"2、按钮(UIButton)的用法",

"3、文本输入框(UITextField)的用法",

"4、多行文本输入框(UITextView)的用法",

"5、开关按钮(UISwitch)的用法",

"6、分段选择控件(UISegmentedControl)的用法",

"7、图像控件(UIImageView)的用法",

]),

1:[String]([

"1、使用占位符文本placeholder添加文本框提示",

"2、使用autofocus让控件自动获取焦点",

"3、表单客户端验证",

"4、日期和时间选择输入",

"5、颜色选择器",])

]

self.articleHeaders = [

"Swift文章",

"HTML5文章"

]

//创建表视图

self.tableView = UITableView(frame:self.view.frame, style:.plain)

self.tableView!.delegate = self

self.tableView!.dataSource = self

//创建一个重用的单元格

self.tableView!.register(UITableViewCell.self,

forCellReuseIdentifier: "SwiftCell")

self.view.addSubview(self.tableView!)

}

//在本例中,有2个分区

func numberOfSections(in tableView: UITableView) -> Int {

return self.articleHeaders.count

}

//返回表格行数(也就是返回控件数)

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

let data = self.articleNames[section]

return data!.count

}

// UITableViewDataSource协议中的方法,该方法的返回值决定指定分区的头部

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int)

-> String? {

return self.articleHeaders[section]

}

// UITableViewDataSource协议中的方法,该方法的返回值决定指定分区的尾部

func tableView(_ tableView:UITableView, titleForFooterInSection section:Int)->String? {

let data = self.articleNames[section]

return "有\(data!.count)篇文章"

}

//创建各单元显示内容(创建参数indexPath指定的单元)

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)

-> UITableViewCell {

//为了提供表格显示性能,已创建完成的单元需重复使用

let identify:String = "SwiftCell"

//同一形式的单元格重复使用,在声明时已注册

let cell = tableView.dequeueReusableCell(withIdentifier: identify,

for: indexPath)

cell.accessoryType = .disclosureIndicator

var data = self.articleNames[indexPath.section]

cell.textLabel?.text = data![indexPath.row]

return cell

}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

}

}

2,调整分组间的间距

如果需要设置组与组之间的间距,可以通过 viewForHeaderInSection、viewForFooterInSection、heightForHeaderInSection或 heightForFooterInSection这几个方法配合实现。

3,去除分组头、分组尾的停留效果

这个通过重写 tableView的 scrollViewDidScroll方法可以实现。要注意的是页面是否有导航控制器,有的话要把自动内边距调整给考虑进去。

(1)分组头部不悬停

//header不悬停

func scrollViewDidScroll(_ scrollView: UIScrollView) {

//组头高度

let sectionHeaderHeight:CGFloat = 30

//获取是否有默认调整的内边距

let defaultEdgeTop:CGFloat = navigationController?.navigationBar != nil

&& self.automaticallyAdjustsScrollViewInsets ? 64 : 0

if scrollView.contentOffset.y >= -defaultEdgeTop &&

scrollView.contentOffset.y <= sectionHeaderHeight - defaultEdgeTop {

scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0)

}

else if (scrollView.contentOffset.y>=sectionHeaderHeight - defaultEdgeTop) {

scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight + defaultEdgeTop,

0, 0, 0)

}

}

(2)分组尾部不悬停

//footer不悬停

func scrollViewDidScroll(_ scrollView: UIScrollView) {

//组尾高度

let sectionFooterHeight:CGFloat = 30

//获取是否有默认调整的内边距

let defaultEdgeTop:CGFloat = navigationController?.navigationBar != nil

&& self.automaticallyAdjustsScrollViewInsets ? 64 : 0

let b = scrollView.contentOffset.y + scrollView.frame.height

let h = scrollView.contentSize.height - sectionFooterHeight

if b <= h {

scrollView.contentInset = UIEdgeInsetsMake(defaultEdgeTop, 0, -30, 0)

}else if b > h && b < scrollView.contentSize.height {

scrollView.contentInset = UIEdgeInsetsMake(defaultEdgeTop, 0, b - h - 30, 0)

}

}

(3)分组头部、尾部均不悬停

//header、footer均不悬停

func scrollViewDidScroll(_ scrollView: UIScrollView) {

//组头高度

let sectionHeaderHeight:CGFloat = 30

//组尾高度

let sectionFooterHeight:CGFloat = 30

//获取是否有默认调整的内边距

let defaultEdgeTop:CGFloat = navigationController?.navigationBar != nil

&& self.automaticallyAdjustsScrollViewInsets ? 64 : 0

//上边距相关

var edgeTop = defaultEdgeTop

if scrollView.contentOffset.y >= -defaultEdgeTop &&

scrollView.contentOffset.y <= sectionHeaderHeight - defaultEdgeTop {

edgeTop = -scrollView.contentOffset.y

}

else if (scrollView.contentOffset.y>=sectionHeaderHeight - defaultEdgeTop) {

edgeTop = -sectionHeaderHeight + defaultEdgeTop

}

//下边距相关

var edgeBottom:CGFloat = 0

let b = scrollView.contentOffset.y + scrollView.frame.height

let h = scrollView.contentSize.height - sectionFooterHeight

if b <= h {

edgeBottom = -30

}else if b > h && b < scrollView.contentSize.height {

edgeBottom = b - h - 30

}

//设置内边距

scrollView.contentInset = UIEdgeInsetsMake(edgeTop, 0, edgeBottom, 0)

}

二、grouped模式

1,默认样式

在 grouped模式下,如果 tableview有多个 section(分区、分组),组与组之间默认是有间距的。

而且在表格滚动的同时组头与组尾会随之滚动、不停留,不会有 sticky效果(粘性效果、悬停效果)。

下面分别是:分区头尾均有、只有分区头、分区头尾都没有。这三种情况:

2,去掉多余的间距

(1)在分组头、分组尾都存在时,可以将 tableview最上方的间距给去除。

//去除表格上放多余的空隙

self.tableView?.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0)

(2)如果只有分组头,没有分组尾,除了将 tableview最上方的间距给去除,还可以将分组尾的高度设置为 0.01(不能设为 0,否则无效)。同时还要将分组尾设置成一个空的 UIView(否则在 iOS11 下分组尾高度不会起作用)。

//去除表格上放多余的空隙

self.tableView?.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0)

//设置分组尾的高度

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {

return 0.01

}

//将分组尾设置为一个空的View

func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {

return UIView()

}

(3)如果分组头、分组尾均没有,还可以将分组头的高度设置为 0.01。

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

return 0.01

}

uiswitch样式_Swift - 表格UITableView的plain、grouped两种样式详解(附分组头悬停)相关推荐

  1. [css] 如何重写行内样式?方法有哪些(至少两种)?

    [css] 如何重写行内样式?方法有哪些(至少两种)? 1, !important 最高级 2, var divStyle = document.querySelector('#div').style ...

  2. 从浏览器下载表格数据为Excel的两种实现方法

    一.使用说明 实际开发运用过程中,往往需要将页面上的一些表格数据生成Excel供用户下载使用,根据不同的需求,此处整理了两种方式:(两种方式浏览器都可直接提示下载或保存文件) 方式一: 1.需求: 生 ...

  3. Python Pandas DataFrame 表格 打印输出不能对齐的两种解决方案

    最近在学数据分析,中英文混合的DataFrame表格会出现print()打印无法对齐的情况,导致输出的结果都没有对齐,十分不美观,也影响直观的分析.下面介绍两种解决方案,总有一款适合你: 准备工作:为 ...

  4. 关于ueditor表格不显示边框的两种形式

    关于ueditor表格不显示边框的问题,分为两种: 1.ue本身自带表格不显示 2.ue复制粘贴进来的表格不显示 关于1: 找到ueditor.all.js中的下列代码,添加 style=" ...

  5. 网站缩略图在线生成器源码最新美化版两种样式图,素材,源码站缩略图站长必备

    源码介绍: 网站缩略图生成源码是一个强大实用的免费网站缩略图在线生成服务站,你只需上传网站截图,它能够在短短的几秒钟内,即可生成出高大尚的美化缩略图.顶部背景刷新随机8张图 各种配色 适应你的源码图, ...

  6. html中border细线样式,网页中实现细线边框的两种方法

    很多朋友都有过制作网页的经历,如今,众多网页的设计都用到了表格.这样不仅有利于网页的维护,同时,提高了网页的观赏性.在众多网页制作风格中,细边框这个制作方法是必不可少的.这里,我将简单地谈一下细边框的 ...

  7. vue斑马纹表格颜色设置,使两种不同的颜色间隔出现,表格背景颜色设置透明度

    <el-table:cell-style="cellStyle":header-cell-style="{ color: '#fff', background: ' ...

  8. vue.js elementUI 表格实现隔行变色,自己定义颜色。(斑马纹表格颜色设置,使两种不同的颜色间隔出现)

    文章目录 此为效果图 开始实现 设置表头和斑马线样式 设置斑马线样式函数 此为效果图 开始实现 设置表头和斑马线样式 <el-table:header-cell-style="{bac ...

  9. 计算机二级考试字处理表格和文字分栏,Exce表格分栏打印输出的两种巧妙方法...

    有时Excel中的表格只有两三列内容,这样在处理完表格中数据如果直接打印输出就会显得很不美观,且浪费纸张.如果能象Word和WPS那样具有分栏功能就好了.下面我们就借助外力对Excel中的表格实现分栏 ...

最新文章

  1. vue打印props的值_vue中props传值方法
  2. 再发力!Facebook AI何恺明等最新研究MoCo(动量对比学习)第二版,超越Hinton的SimCLR,刷新SOTA准确率...
  3. Sublime Es6教程1-环境搭建
  4. 微信小程序学习笔记(六)
  5. 也谈闭包--小白的JS进阶之路
  6. PMP之项目资源管理---激励理论
  7. 命令执行——命令执行漏洞概述(一)
  8. android webview卡顿检测_Android webview隐藏后跳转新页面input输入卡顿与白屏渲染慢的问题说明及修复方案...
  9. linux c程序加args,C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用
  10. 容器编排技术 -- Kubernetes Service
  11. oracle数据库看开销,【Database】AIX系统下跟踪开销大的Oracle数据库进程
  12. xp怎么删除计算机用户,谁了解xp系统如何删除工作组计算机
  13. android 手机固定mac地址吗,Android手机获取Mac地址的几种方法
  14. B00014 C++实现的AC自动机
  15. 【系统架构】缓存Memcache 使用原子性操作add,实现并发锁
  16. 梯度、散度、旋度的简单总结
  17. 【转】Unity5 新AssetBundle打包方式 BuildPipeline.BuildAssetBundles
  18. 影片推荐:《机械姬》
  19. 车载网络测试 - 车载以太网 - ARP详细解析
  20. 论文复现—1—A Simple yet Effective Relation Information Guided Approach for Few-Shot Relation Extraction

热门文章

  1. 基于RBAC的权限设计
  2. 计算机网络多元化媒体传达,【多媒体技术论文】视觉传达设计多媒体技术的应用(共4007字)...
  3. mysql创建函数失败_mysql创建函数出现问题?
  4. c ajax 上传图片,ajax +NodeJS 实现图片上传实例
  5. Yet Another Broken Keyboard
  6. PAT_B_1057_Java(20分)
  7. python性能分析工具_Python Profilers 分析器
  8. 【三分钟讲清区块链/比特币】之二:比特币入门教程
  9. 如何清理Virtualbox虚拟机VDI镜像文件的空间大小
  10. [机器学习] 半监督学习---伪标签Pseudo-Label