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

当我尝试使用tableView(moveRowAt:)对行进行重新排序时,TableView行高缩小

在使用tableView(moveRowAt:)方法对行进行重新排序时,如果发现TableView的行高缩小,可能是由于以下几个原因导致的:

基础概念

  • TableView: 是iOS开发中用于展示列表数据的控件。
  • moveRowAt(_:to:): 这是UITableView的一个方法,用于在表格视图中移动一行数据。

可能的原因

  1. 自动布局问题: 如果使用了自动布局,可能在移动行时触发了某些约束的重新计算,导致行高变化。
  2. 数据源更新问题: 在移动行后,数据源可能没有正确更新,导致TableView重新加载时使用了错误的行高。
  3. 缓存问题: TableView可能缓存了旧的行高信息,在移动行后没有及时更新缓存。

解决方案

以下是一些可能的解决方案:

1. 确保数据源正确更新

在调用moveRowAt(_:to:)方法后,确保数据源也进行了相应的更新。

代码语言:txt
复制
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
    // 假设你的数据源是一个数组
    let movedObject = yourDataSource[sourceIndexPath.row]
    yourDataSource.remove(at: sourceIndexPath.row)
    yourDataSource.insert(movedObject, at: destinationIndexPath.row)
    
    // 更新TableView
    tableView.moveRow(at: sourceIndexPath, to: destinationIndexPath)
}

2. 重置行高缓存

在移动行后,可以尝试重置TableView的行高缓存。

代码语言:txt
复制
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
    // 更新数据源
    let movedObject = yourDataSource[sourceIndexPath.row]
    yourDataSource.remove(at: sourceIndexPath.row)
    yourDataSource.insert(movedObject, at: destinationIndexPath.row)
    
    // 移动行
    tableView.moveRow(at: sourceIndexPath, to: destinationIndexPath)
    
    // 重置行高缓存
    tableView.reloadData()
}

3. 使用固定行高

如果行高变化是由于自动布局引起的,可以考虑使用固定的行高。

代码语言:txt
复制
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 50.0 // 设置一个固定的行高
}

4. 使用estimatedRowHeight

如果行高是动态计算的,可以使用estimatedRowHeight来优化性能。

代码语言:txt
复制
tableView.estimatedRowHeight = 50.0
tableView.rowHeight = UITableView.automaticDimension

应用场景

  • 列表排序: 在需要用户手动对列表项进行排序的应用中,如任务管理器、购物清单等。
  • 动态内容展示: 当列表项的内容是动态生成的,且行高不固定时。

示例代码

以下是一个完整的示例,展示了如何在移动行时确保行高不变:

代码语言:txt
复制
class YourViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    var yourDataSource = [YourDataType]()
    
    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = self
        tableView.delegate = self
        tableView.estimatedRowHeight = 50.0
        tableView.rowHeight = UITableView.automaticDimension
    }
    
    // MARK: - UITableViewDataSource
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return yourDataSource.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellIdentifier", for: indexPath)
        // 配置cell
        return cell
    }
    
    // MARK: - UITableViewDelegate
    
    func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        let movedObject = yourDataSource[sourceIndexPath.row]
        yourDataSource.remove(at: sourceIndexPath.row)
        yourDataSource.insert(movedObject, at: destinationIndexPath.row)
        
        tableView.moveRow(at: sourceIndexPath, to: destinationIndexPath)
    }
}

通过以上方法,可以有效解决在使用tableView(moveRowAt:)方法时行高缩小的问题。

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

相关·内容

  • iOS中表视图(UITableView)使用详解

    UITableViewDataSource> dataSource; @property (nonatomic, assign)   id   delegate; 设置表示图的行高...sectionHeaderHeight;    @property (nonatomic)          CGFloat                     sectionFooterHeight;  设置一个行高的估计值...的行高是可变的,那么设计一个估计高度可以加快代码的运行效率。...tableView的顶部         UITableViewScrollPositionMiddle,//定位完成后,将定位的行显示在tableView的中间        UITableViewScrollPositionBottom...,tableView会立刻调用代理方法进行刷新,如果其中我们所做的操作是删除某行,而然数据源数组我们可能并没有刷新,程序就会崩溃掉,原因是代理返回的信息和我们删除后不符。

    1.4K30

    设置Cell的行高:五种方法及优先级1. 四种基本设置方法2. 四种方法的优先级3. 自动进行计算cell的行高

    传统意义上设置tableView的行高一共有四种方法。等等,标题不是说有五种方法嘛。别着急,咱们先看四种最基本的方法,最后再说第五种自动计算行高的方法。 1....最后加载代理方法,这样会将之前设置的内容进行覆盖。 3. 自动进行计算cell的行高 终于来了第五种方法,这里设置约束的时候用到Masonry的第三方框架。...在设置数据时一定要注意,有配图就设置上; 没有配图,一定要把image重新写为nil。 我们平时设置约束很多都是上左宽高,不管底边。...3.2 具体实施 3.2.1 添加预估行高、自行计算行高 //预估行高 //自动计算行高 self.tableView.rowHeight = UITableVIewAutomaticDimension...代码一: // 为了自动设置行高,就必须对从contentView的底边进行约束 [self.contentView mas_makeConstraints:^(MASConstraintMaker

    1.6K60

    IOS开发的基础知识建议收藏

    大家好,又见面了,我是全栈君 1.为什么对一个变量release后还要设为nil   对一个变量release后,这个变量指向的内存释放了,但这个变量本身没变,仍指向原来的内存地址。...设为nil后这个变量指向0×00,可以保证程序以后访问不到原先的内存地址,对nil进行release也没任何问题。 2....的机制大概是:先定好总行数,某一行滚入视图范围时,回调一个函数去取view出来显示。...这一行滚出视图再滚入时仍会继续回调这一函数取view。...曾尝试webview嵌在tableview里,为了让webview跟tableview一起滚动,把webview的大小设为webview里的内容大小,让webview不出滚动条,从而能跟着tableview

    55520

    React-Native iOS 列表(ListView)优化方案

    针对 React-Native 的列表性能问题,现在提供几套可行性方案: 1.利用 Facebook 提供的建议对 ListView 进行优化 Facebook 官方对 ListView 的性能优化做了简单介绍...如果我们想尽可能的快,我们可以设置它为1, 然后可以在后续的帧中,填弃其它的行。...当我们的需求比较复杂或者需求发生变化时,就需要重新桥接我们的自定义 cell,这样工作量就会比较大。...当我们在进行列表展示的时候,如果数据量不是特别的庞大(不是无限滚动的),且界面比较复杂的时候,方案1能够比较好的解决性能问题,而且操作起来比较简单,只需要对 listview 的一些属性进行基本设置。...当我们需要展示很多数据的时候(不是无限滚动的),我们可以使用方案2,对那些超出屏幕外的部分,对他进行组件最小化 当我们需要展示大量数据(可以无限滚动的),我们可以通过方案3/4,来达到重用的目的

    1.9K20

    TableView优化之快速滑动下的忽略加载

    那么为什么VVebo使用率那么高呢?一方面是当时新浪微博客户端的确不行,另一方面VVebo简约的风格和流畅的体验俘获了一大批用户。所以今天我们就来探究一下他是如何做到TableView的丝滑体验的。...在老司机看来,作者最有效的优化分为4部分: TableViewCell圆角优化 缓存行高 相对固定的图片及文字采用CoreText绘制 TableView加载数据逻辑优化 ---- 1.圆角 这部分作者的优化很简单...= ---- 2.缓存行高 这部分内容老司机在上一期讲述过不定高cell行高缓存的必要性及缓存的方法,这里不再赘述。...但是代码怎么可能不写,只是我在别的地方写过了,并且花了大把时间进行解耦,让每一个TableView都能拿来就直接使用。 那么这个解耦的类我们要怎么写呢? 好的,我们来新建一个文件。...老司机添加了高度缓存、滚动优化等优化功能,并且对选择、展示动画、无数据占位图等常用功能都进行了支持。而且老司机也在不断的丰富helper类的功能。 只放一个版本更新记录吧,代码放不下=。

    1.7K33

    iOS-TableView统一数据源代理

    只要遵循它,就不用每次都要写一大堆的代理方法,下面就是我写的一个代理类的使用 private var delegate = CCDataSource() lazy private var...尾部高度 return 0.01 }.rowHeight{ (indexPath, data) -> (CGFloat) in // 8.行高...的代理,这里我将dataSource和delegate统一为delegate了,并且如果有多个TableView,我们还可以创建多个代理实例与其一一对应 网络请求:这里是做网络请求地方,并且将请求后的数据保存在代理类中...来返回相应的cell注册的identifier即可 头部高度:header的高度,可以是定值,也可以根据section来动态返回 尾部高度:footer的高度,可以是定值,也可以根据section来动态返回 行高...:这里的行高可以通过data来获取,这样利于做高度缓存,也可以通过indexPath来动态返回 配置数据源:这里可以获取的已经初始化号的cell和其对应的数据源,我们只需要将其赋值给cell即可 点击事件

    93410

    实际操作-手把手探究tableViewCell上的控件点击事件进阶篇:实际项目操作

    答:使用手势。 ?...---- -------------------------华丽分割线------------------------ 正确做法:不在tableView的行点击进行数据请求,要拿到数据下标,并不只有didSelectRowAtIndexPath...我们拿到的当前行的数据,是tableView - cellForRowAtIndexPath方法设置cell数据展示的时候,一行一行传过来的,所以每个indexPath.row对应的数据,我们通过网络请求...原理解释 如图:我们并不调用行点击事件,但是当我们点击cell的按钮,通过代理把cell的内容(如上图的内容:b)回传到控制器tableView上显示的时候,从tableVIew展示的内容-->b,我们就可以知道刚才点击的是哪个...-->而且完美解决了AFN异步网络请求导致的需要数据可能为空的问题,也希望能给新手们提供一点探究原理的思路和流程,小tips:面试的时候,如果你体现出对技术的渴望,对底层原理的探究,探究的思路和步骤等等

    3.7K50

    在iOS中怎样创建可展开的Table View?(下)

    开始我们需要知道点击行的索引(记住,不是实际的indexPath.row)而是可见cell的行索引,所以我们将会开始在下面的tableView代理方法里给它分配一个局部变量: func tableView....所以,在我们重新加载tableView之前,我们需要app找到可见行的索引值: func tableView(tableView: UITableView, didSelectRowAtIndexPath...tblExpandable.reloadSections(NSIndexSet(index: indexPath.section), withRowAnimation: UITableViewRowAnimation.Fade) } 正如你看到的,我使用了动画的方式来重新加载点击...tableView的方法,主要的特点就是在一个plist文件中,所有cell的描述都使用具体的属性.我向你展示了当cell显示,打开或是选中的时候,如何使用代码处理cell的描述列表;此外,我给了你一个方法通过用户输入数据来直接更新它....肯定你会发现方法来改进给定的代码,或者根据你的需要来调整它.是时候说再见了,玩的开心,永远不要停止尝试!

    1.5K30

    iOS11、iPhone X、Xcode9 适配

    属性被废弃了,因此当tableView超出安全区域时,系统自动会调整SafeAreaInsets值,进而影响adjustedContentInset值 // 有些界面以下使用代理方法来设置,发现并没有生效...,却没有实现View的代理方法,iOS10及以前这么写是没问题的,iOS11开启了行高估算机制引起的bug,因此有以下几种解决方法: // 解决方法一:添加实现View的代理方法,只有实现下面两个方法,...viewForHeaderInSection:(NSInteger)section { return nil; } // 解决方法二:直接使用tableView属性进行设置,修复该UI错乱 self.tableView.sectionHeaderHeight...0, 0, 0)]; // 解决方法三:添加以下代码关闭估算行高 self.tableView.estimatedRowHeight = 0; self.tableView.estimatedSectionHeaderHeight...如果使用了Masonry 进行布局,就要适配safeArea ([UIDevice currentDevice].systemVersion.floatValue >= 11.0) { make.edges.equalTo

    48920

    《Motion Design for iOS》(三十八)

    动画Interesting的Stories Into Position 当我的新闻app Interesting首次打开时,我会发起一个网络请求来拉取最近的文章。...一些app选择在数据返回时淡入列表,一些会将行一行行地滑动到位置上,而其他的则立即显示行,没有任何动画。...如果数据返回了并且我调用了[self.tableView reloadData],它会立即出现并且对用户可见。...然后我会调用[self.tableView reloadData]将数据加载到列表行中去,这时候所有的行都在它们正常的位置上,但因为整个列表透明度为0并且是隐藏的,屏幕上什么都看不见。...因为我在一个循环中,我可以同步地使用循环次数变量b来保持动画的时间,只需要操作每行的动画时间间隔即可。这可以确保每一行的动画之间都是同样的时间,来达到一个好的波浪形动作。这就是全部了!

    45520
    领券