首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

UITableView在设备旋转后保持滚动位置

UITableView是iOS开发中常用的列表视图控件,用于展示大量数据并支持滚动。当设备旋转时,UITableView默认会重新加载数据并回到顶部,这可能会导致用户在滚动过程中的位置丢失。为了保持滚动位置,可以通过以下步骤实现:

  1. 在UITableView所在的ViewController中,创建一个全局变量来保存当前滚动的位置。例如,可以在ViewController的类定义中添加一个属性:
代码语言:txt
复制
var lastContentOffset: CGPoint = .zero
  1. 在UITableViewDelegate中的scrollViewDidScroll(_:)方法中,更新lastContentOffset的值:
代码语言:txt
复制
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    lastContentOffset = scrollView.contentOffset
}
  1. 在设备旋转时,通过以下步骤来恢复滚动位置:
  • 在ViewController中重写viewWillTransition(to:with:)方法,该方法会在设备旋转之前被调用。
  • 在该方法中,获取UITableView的可见行的索引路径,并计算出旋转前的可见行的索引路径。
  • 在旋转后,使用scrollToRow(at:at:animated:)方法将UITableView滚动到旋转前的可见行。
代码语言:txt
复制
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    
    coordinator.animate(alongsideTransition: { _ in
        // 获取旋转前的可见行的索引路径
        if let indexPathsForVisibleRows = self.tableView.indexPathsForVisibleRows,
           let firstVisibleIndexPath = indexPathsForVisibleRows.first {
            let rect = self.tableView.rectForRow(at: firstVisibleIndexPath)
            let convertedRect = self.tableView.convert(rect, to: self.tableView.superview)
            let contentOffsetY = convertedRect.origin.y - self.tableView.contentInset.top
            self.lastContentOffset = CGPoint(x: 0, y: contentOffsetY)
        }
    }, completion: { _ in
        // 恢复滚动位置
        self.tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: false)
        self.tableView.contentOffset = self.lastContentOffset
    })
}

通过以上步骤,UITableView在设备旋转后可以保持滚动位置,提升用户体验。

UITableView的优势在于其高度可定制化的特性,可以展示各种类型的数据,并支持自定义的单元格样式。它适用于需要展示大量数据的场景,如联系人列表、新闻列表、商品列表等。腾讯云提供的相关产品包括云服务器、云数据库MySQL版、云存储COS等,可以帮助开发者构建稳定可靠的云端应用。

更多关于UITableView的信息和使用方法,可以参考腾讯云文档中的UITableView官方文档

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【IOS开发基础系列】Table View开发专题

解决的办法就是bitmap context里先将其画一遍,导出成UIImage对象,然后再绘制到屏幕,详细做法可见《利用预渲染加速iOS设备的图像显示》。...做到前几点,你的table view滚动时应该足够流畅了,不过你仍可能让用户感到不爽。常见的现象就是更新数据时,整个界面卡住不动,完全不响应用户请求。...例如每次载入50条信息,那就可以滚动到倒数第10条以内时,加载更多信息: - (void) tableView: (UITableView *)tableView willDisplayCell: (...3 参考链接 (good)优化UITableView性能 http://www.keakon.net/2011/08/03/优化UITableView性能 利用预渲染加速iOS设备的图像显示 http:...//www.keakon.net/2011/07/26/利用预渲染加速iOS设备的图像显示 优化UITableView滚动性能 http://blog.csdn.net/chaoyuan899/article

35620

IOS开发:教你实现手机直播系统平台评论功能效果

消息列表,必定是一个UITableView,每个消息是一个cell,每次接收到一条消息立刻添加到数据数组中,同时刷新UITableView滚动到底部。 没错思路就是这样,但是问题来了. . ....即使UITableView有复用机制,也还是不行的,整个效果有一闪一闪的。可以试一下就知道了。 那么不能刷新,我们就用插入第n行,并且滚动到第n行 没错 . . . 就是这样实现效果了 . . ....原因,在于消息所在的高度还不过我们设置UITableView的高度,滚动到第n行的时候并没有效果。 那么我们换一个思路,来实现,那就是从下往上添加数据。 这样不管你数据多少都会有动画。...旋转180 _tableView.transform = CGAffineTransformMakeScale(1, -1); 然后单单把UITableView旋转,你会发现,还有问题 什么问题 ?...那我们把文字内容的视图旋转180,即cell旋转180 self.contentView.transform = CGAffineTransformMakeScale(1, -1);

2K00
  • iOS开发笔记(十一)— UITableView、ARC、xcconfig、Push

    前言 分享iOS开发中遇到的问题,和相关的一些思考,本次内容包括:UITableView滚动问题、ARC、xcconfig、Push证书。...正文 UITableView UITableViewreloadData 的时候,如果height的高度发生较大变化,contentOffset无法保持原来的大小时,会发生滚动的效果。...如果直接reloadData再setContentOffset:设置位置,仍会出现滚动的效果。...如果需要去除该滚动效果,可以reloadData之后,调用scrollToRowAtIndexPath并设置animated:NO,最后再用setContentOffset:微调位置。...从这里去分析,如果需要滚动到准确的位置,可以用estimatedRowHeight的属性,设置和行高一样的高度;在行高各不相同的场景,可以设置estimatedRowHeight为大致的数字,scrollToRowAtIndexPath

    1.8K20

    iOS开发常用之网络

    QuickRearrangeTableView - 基于UITableView的快速重排功能扩展子类。通过长按选定单元格然后滚动移动到指定位置。...XTPaster - 贴纸功能出现在很多图片社交中,就是图片上面贴图片,对贴纸而言就是需要控制贴纸的位置旋转,大小,如何使用。 RGCategoryView - 仿了个苏宁易购的分类页面。...VJDeviceSpecificMedia - 如何根据设备选择不同尺寸的图片 可以通过设置不同尺寸的设备的LaunchImage,来使用App适配这些设备,要在不同尺寸设备上使用不同大小的图片,则需要在代码中一一判断...用于简化实现各种类型的旋转木马(分页滚动视图),无限轮播,iOS开发之多图片无缝滚动组件封装与使用。 KIPageView - 无限循环PageView,横向TableView,无限轮播。...KYAnimatedPageControl - 除了滚动视图时PageControl会以动画的形式一起移动,点击目标页还可快速定位。支持两种样式:粘性小球和旋转方块。

    23.6K10

    iOS流水布局UICollectionView简单使用引实现结

    如果熟悉UITableView的话,其实很多地方都是类似的,甚至可以说UITableView是一种特殊的UICollectionView,正如正方形是一种特殊的矩形一样,UITableView就是一种每行只放一个方块的...自定义Cell 根据UITableView的经验。首先看每个方块,也就是每个cell怎么呈现,这里的cell明显是自定义的,我们用一张图片填满cell,同时底部居中的位置放置一个label。...为了显得真实一点,我用了一个随机数来决定每个cell显示的图片和文字,这样呈现的时候就不会太过千篇一律。...255.0 green:235.0/255.0 blue:235.0/255.0 alpha:1]; // 注册cell,此处的Identifier和DataSource方法中的Identifier保持一致...代码中注释了一行,就是用来设置滚动方向为水平的,效果如下: 同样的内容,滚动方式变化,呈现的效果也会变化。

    1.1K00

    UIScrollView进阶技巧

    今天主要讲三个跟交互有关的效果(稍微有点标题党啊,其实也没有多进阶……),也不是直接用的UIScrollView,而是它的子类UITableView和UIWebView。...列表上面是三个栏目按钮和轮播图片,向上滚动时,按钮和图片一起向上,按钮周边区域颜色渐变,然后在到指定位置时(这里是盖住导航栏之后)按钮停住不动,周边颜色也完全变成导航栏的颜色,列表数据还可以继续滚动。...这个属性是UIScrollView的,用来指定内容边界,UITableView继承自UIScrollView,当然也含有这个属性。...里的内容Y轴上的偏移量。...第二个效果是拉出一个按钮,按钮的背景色也是由浅入深渐变,拉出来之后按钮就停在顶部,然后刷新图标(旋转小菊花)会在按钮下面显示。

    97840

    iOS实例——滑动列表展现隐藏顶部视图

    在此基础上海加了一个隐藏列表时的动态渐入渐出效果,如下: 实现 实现的要点是,顶部的视图要随着列表的滚动滚动,且列表最上是可以滚动到屏幕顶部的,最下就是滚动到一个固定的位置就不再往下滚动了,至于渐变效果只要能控制滚动自然也能控制随着滚动去改变...,就必须获知列表的滚动效果,这里我们自定义的顶部视图类中加一个UIScrollView属性,初始化的时候就将我们的列表赋给这个属性(UITableView是UIScrollView的子类):...处理方法中我们要做两件事,第一件事是让顶部视图的高度随着列表移动而移动,但是要控制列表最高移动到的位置TOP和最低移动到的位置BOTTOM,这其实就是顶部视图的低端对应的Y值。...startChangeOffset = - self.headerScrollView.contentInset.top;// -BOTTOM // 往下拉的时候是否超过BOTTOM,超过的话保持...BOTTOM不变,往上滑的话是否低于TOP,是的话保持TOP,也就是最多滑到BOTTOM,最少有TOP newOffset = CGPointMake(newOffset.x, newOffset.y

    1.9K10

    UITableView性能优化-中级篇

    老实说,UITableView性能优化 这个话题,最经常遇到的还是面试中,常见的回答例如: Cell复用机制 Cell高度预先计算 缓存Cell高度 圆角切割 等等. . ....,是的话,不加载图片; cell 滚动结束的时候,获取当前界面内可见的所有cell 2的基础之上,让所有的cell请求图片数据,并显示出来 步骤1: - (UITableViewCell *)tableView...started scrolling. this may require some time and or distance to move to initiate dragging 可以理解为,用户拖拽当前视图滚动...cancelLoadImage{ [_task cancel]; } @end 思路: 创建一个可变字典,以indexPath:manager的格式,将当前的图片下载操作存起来 每次下载之前,将当前下载线程存入,下载成功,...Demo源码 ---- 参考资料 iOS 保持界面流畅的技巧 VVeboTableViewDemo YYKitDemo UIScrollView 实践经验

    1.6K20

    iOS开源小项目-WSL

    WSL是一款拥有 音乐播放,新闻,壁纸,画板,简易地图,计时器等等功能的小项目,是我自己早期学习时做着玩的,并没上架;UI是自己设计,所以挺吃藕的,粗糙的,没做适配,是6尺寸下开发的 ,还希望不要嫌弃了...动画.gif 动画主要代码:UITableView的代理方法 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell...//设置anchorPoint cell.layer.anchorPoint = CGPointMake(0, 0.5); //为了防止cell视图移动,重新把cell放回原来的位置...cell.layer.position = CGPointMake(0, cell.layer.position.y); //设置cell 按照z轴旋转90度,注意是弧度...; 2017/6/7更新:由于接口数据发生了改变,可能现在音乐播放器这块儿没法看到效果,我把锁屏效果和歌词解析,滚动显示功能单独抽出来又写了一篇文章和demo,感兴趣可以去我的这篇文章看看 iOS 音乐播放器之锁屏效果

    2.7K60

    iOS开发中利用UICollectionView创建文字轮播控件

    https://blog.csdn.net/u010105969/article/details/79912517 背景: 公司项目中有一个需求:首页上添加一个纵向滚动的文字轮播广告。...使用UITableView就不用考虑复用以及调整scrollView上子控件位置的问题了。...手动敲代码利用UITableView实现具有需求效果的控件,可当UITableView滑动到最后一个cell再滑动到第一个cell的时候出现问题(并不能很流畅地从最后一个cell滑动回第一个cell)。...滚动代码: // 1、当前正在展示的位置 NSIndexPath *currentIndexPath = [[self.collectionView indexPathsForVisibleItems...indexPathForItem:nextItem inSection:nextSection]; // NSLog(@”next:%lu”, nextIndexPath.row); // 3、通过动画滚动到下一个位置

    1.3K20

    UIScrollView的一步步实现1 简介1.1 工作原理1.2 UIScrollView常见的几个重要控件1.3 UIScrollView常见的重要属性1.4 手工代码实现拖动2 三个重要属性的进

    移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也相当有限。当展示的内容较多,超出一个屏幕时,用户可通过滚动手势来查看屏幕以外的内容。...UIScrollView是一个能够滚动的视图控件,可以用来展示大量的内容,并且可以通过滚动查看所有的内容 1.1 工作原理 缩放的时候,原理是操作被缩放控件的的transform数值。...缩放结束 scrollView 本身的 frame 并没有发生变化 缩放结束 imageView 本身的 bounds 也没有发生变化 缩放结束 imageView 的 center 发生了变化...,则什么也不做 如果指定的区域已经可视范围,不会滚动 如果指定的区域完全超出contentSize的范围,不会滚动 如果指定的区域超越了当前可视区域,但没有超出contentSize的区域,可以滚动...是不改变原有的contentSize基础上,让scrollView中的内容向四周多滚动一些。

    1.6K60

    优雅的处理网络数据,你真的会吗?不如看看这篇.

    相信大家平时在用 App 的时候, 往往有过这样的体验,那就是加载网络数据等待的时间过于漫长,滚动浏览时伴随着卡顿,甚至没有网络的情况下,整个应用处于不可用状态。...,然后控件底部显示一个 Loading 动画,待请求数据返回,Loading 动画消失,由 UITableView 或者 UICollectionView 控件继续加载这些数据并显示给用户,效果如下图所示...为了改善应用程序体验, iOS 10 上,Apple 对 UICollectionView 和 UITableView 引入了 Prefetching API,它提供了一种需要显示数据之前预先准备数据的机制...首先,我先和大家介绍一个概念:无限滚动,无限滚动是可以让用户连续的加载内容,而无需分页。 UI 初始化的时候 App 会加载一些初始数据,然后当用户滚动快要到达显示内容的底部时加载更多的数据。...如何避免滚动时的卡顿 当你遇到滚动卡顿的应用程序时,通常是由于任务长时间运行阻碍了 UI 主线程上的更新,想让主线程有空来响应这类更新事件,第一步就是要将消耗时间的任务交给子线程去执行,避免获取数据时阻塞主线程

    1.4K20

    【IOS开发基础系列】UICollectionView专题

    1.3 关于重用         为了得到高效的View,对于cell的重用是必须的,避免了不断生成和销毁对象的操作,这与UITableView中的情况是一致的。...iOS5中,Apple对UITableView的重用做了简化,以往要写类似这样的代码: UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier...在对collection view的重用ID注册,就可以像UITableView那样简单的写cell配置了:     MyCell*cell=[cvdequeueReusableCellWithReuseIdentifier...return cell; }         需要吐槽的是,对collection view,取重用队列的方法的名字和UITableView里面不一样了,Identifier前面多加了Reuse五个字母...需要注意根据滚动方向不同,header和footer的高和宽中只有一个会起作用。垂直滚动时section间宽度为该尺寸的高,而水平滚动时为宽度起作用,如图。

    73030

    微信小程序仿APP section header 悬停效果

    美好的心情.jpeg 很多APP都有这么一个效果,列表头滚动到顶部时会悬停在顶部,比如在iOS开发中UITableview设置 style 属性设置为 Plain ,这个tableview的section...header滚动时会默认悬停在界面顶端。...1、我们需要在页面布局完成获取到头部的位置onReady方法中,查询section-header节点并拿到该节点此时距离当前顶部的距离 注意是 此时,这个后面再讲 /** * 页面加载完成...false }) } }, 3、修改相应的样式: 将原来的header修改为如下代码,并添加一个placeholder视图,目的是当我们的section-header视图悬停时,保持占位...所以我们改变高度之后,要再次调用该函数去获取距离"当前顶部"的距离,这也是要注意的一个点,如果我能直接再次获取并赋值,发现还是有问题,就是因为此时获取的top不是距离整个page页面顶部,而我们监听的页面滚动却是

    2K20

    【笔记】《游戏编程算法与技巧》1-6

    然后按照设置好的索引位置和区域大小来从表单中读取所需的图像, 这样能消除图像切换的消耗 下图左边是分离的图像, 右图是整合的精灵表单: 常见的2D游戏 单轴滚屏: 游戏世界只按照x轴或y轴滚动,...: 游戏世界会同时xy上滚动, 类似单轴滚屏, 需要同时准备四张背景图像用于显示, 而且背景不再使用链表来组建, 而是改为二维数组来决定目前需要显示哪些背景图像 砖块地图: 将背景切分为等分的方块,...注意运算最后的齐次坐标的w分量应该总保持为0或1 w为0的向量表示3D方向, w为1的向量表示3D的点 四种最基本的三维变换: 缩放: 只需要缩放的轴对应的对角线上设置倍率, 其他位置保持0....其中q_v中的a是旋转轴, theta是旋转角 四元数使用前要记得将向量分量q_v归一化才能正常使用, 否则旋转会表现出奇怪的缩放效果 四元数也可连续使用, 但需要以下式进行相乘, 且顺序相反,...第一人称游戏的情况最简单, 监听者就是相机的方向和相机朝向即可 第三人称动作游戏的监听者比较难设置, 比较好的设置是监听者的位置相机与角色之间中点附近的位置, 朝向等于相机的朝向, 具体视需求而定 发射者最基础的设置是音量大小和衰减半径

    4.1K31

    UIScrollView

    前面两篇文章聊的UITableView和UICollectionView都是继承自UIScrollView,本篇文章就来简单聊聊UIScrollView。 ?...frame是视图屏幕中展示的位置和大小,也就是可视区域的位置和大小。 contentSize是scrollView视图的内部内容可以滚动的区域大小,也就是scrollView视图内容的实际大小。...中断一些业务逻辑,比如视频、gif的播放(列表拖动的时候停止播放gif和视频) - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView...用于页面滚动停止的时候开启一个逻辑,比如视频自动播放(页面停止滚动,开启视图滚动前暂停的gif或者视图的播放) - (void)scrollViewDidEndDecelerating:(UIScrollView...上图是我知乎首页的一个截图。 首先,整个从上而下它是一个tableView+collectionView。

    89920

    【IOS开发基础系列】UIScrollView专题

    1 UIScrollView原理        滚动过程当中,其实是修改原点坐标。当手指触摸,scroll view会暂时拦截触摸事件,使用一个计时器。...一个滚动的视图可以根据手指的移动,调整原点的位置。展示内容的视图,根据滚动视图的原点位置,开始绘制视图的内容,这个原点位置就是滚动视图的偏移量。...重要的提示:UIScrollView对象中,你不应该嵌入任何UIWebView和UITableView。...重用的方法如下:     1.如果scrollView向下面滚动,一旦一排视图滚出了可视范围,就改变滚动出去的那个viewscrollView中的frame,也就是改变位置到达末尾,达到重用的效果。...它在这些对象之间保持了松散的配对,视图本身与视图控制器或任何其它的控制器对象,委托不是滚轴视图的直接子类,它比起牢固配对的子类更加的松散。

    57030
    领券