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

UIViewRepresentable中的UICollectionView不会从onAppear scrollToItem

UIViewRepresentable是SwiftUI中的一个协议,用于将UIKit中的视图包装成SwiftUI视图。UICollectionView是UIKit中的一个类,用于展示可滚动的、多列的、可定制的集合视图。

在UIViewRepresentable中使用UICollectionView时,可以通过设置UICollectionView的contentOffset来实现滚动到指定的item。在onAppear生命周期方法中,可以调用UICollectionView的scrollToItem方法来实现滚动到指定的item。

以下是一个示例代码,演示了如何在UIViewRepresentable中使用UICollectionView并在onAppear中滚动到指定的item:

代码语言:txt
复制
import SwiftUI

struct MyCollectionView: UIViewRepresentable {
    let data: [String]
    let scrollToIndex: Int
    
    func makeUIView(context: Context) -> UICollectionView {
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .vertical
        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
        collectionView.dataSource = context.coordinator
        collectionView.delegate = context.coordinator
        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
        return collectionView
    }
    
    func updateUIView(_ uiView: UICollectionView, context: Context) {
        uiView.reloadData()
        if scrollToIndex < data.count {
            let indexPath = IndexPath(item: scrollToIndex, section: 0)
            uiView.scrollToItem(at: indexPath, at: .centeredVertically, animated: true)
        }
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    class Coordinator: NSObject, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
        let parent: MyCollectionView
        
        init(_ parent: MyCollectionView) {
            self.parent = parent
        }
        
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            parent.data.count
        }
        
        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
            cell.backgroundColor = .blue
            return cell
        }
        
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
            CGSize(width: 100, height: 100)
        }
    }
}

struct ContentView: View {
    let data = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5"]
    
    var body: some View {
        MyCollectionView(data: data, scrollToIndex: 2)
            .onAppear {
                // 在这里可以执行滚动到指定item的操作
            }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

在上述示例代码中,MyCollectionView是一个遵循UIViewRepresentable协议的自定义视图。它包含一个data数组用于展示UICollectionView的内容,以及一个scrollToIndex参数用于指定要滚动到的item的索引。

在updateUIView方法中,我们调用了UICollectionView的reloadData方法来刷新数据,并通过scrollToItem方法将UICollectionView滚动到指定的item。在onAppear闭包中,我们可以执行滚动到指定item的操作。

请注意,这只是一个示例代码,实际使用时需要根据具体需求进行适当的修改和调整。

腾讯云相关产品和产品介绍链接地址:

以上是一些腾讯云的产品,供参考使用。

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

相关·内容

在SwiftUI中使用UIKit视图

如果你已经对如何使用UIViewRepresentable有所掌握,可以直接SwiftUI风格化部分阅读 基础 在具体演示包装代码之前,我们先介绍一些与在SwiftUI中使用UIKit视图有关基础知识...比如onAppear同viewWillAppear表现很类似。同UIKit钩子方法位置有很大不同, onAppear和onDisappear是在当前视图父视图上声明。...UIViewRepresentable协议 在SwiftUI包装UIView非常简单,只需要创建一个遵守UIViewRepresentable协议结构体就行了。...>text,这导致Demo视图中name并不会因为文字录入而发生改变。...Text只有在针对本身foregroundColor没有设置时候,才会尝试当前环境获取foregroundColor(针对View)设定。

8.1K20

新闻类App顶部菜单栏封装

概述 最近有一个需求,类似今日头条顶部菜单栏。唯一区别是需要带可移动下划线。网上查找资料,发现解决方案大部分是用UIScrollView实现。下方VC控制用UICollectionView。...菜单栏使用UICollectionView,VC控制使用PageViewController。 这样做目的是为了完全复用,支持无限扩展。因为菜单栏是collectionView,所以不怕内存爆掉。...如果使用CollectionView,CollectionView有一个方法:  open func scrollToItem(at indexPath: IndexPath, at scrollPosition...在collectionView,滑动cell时候其实只是offset在变,cellframe其实是不变,collectionView其实也是个ScrollView,cell是加在scrollView...初始化方法修改后记得在ScrollPageView修改自定义VC初始化。

1K20

AVKit框架详细解析(四) —— 基于AVKit 和 AVFoundation框架视频流App构建

Adding Local Playback 您可以播放两种类型视频。 您将看到第一个是当前位于手机存储类型。 稍后,您将学习如何服务器播放视频流。...在同一个文件,在LoopingPlayerUIView定义之外添加这些代码行: struct LoopingPlayerView: UIViewRepresentable { let videoURLs...: [URL] } UIViewRepresentable 是一个协议。...由于您将从该结构体外部控制播放,因此您可以 LoopingPlayerUIView 初始值设定项删除这两行: player?.volume = 0.0 player?....您会在左上角看到画中画按钮……否则不会! 缺点是,在撰写本文时,iOS 14.5是可用最新版本,VideoPlayer SwiftUI 视图未显示画中画按钮。

6.9K10

onAppear 调用时机

本文将通过 SwiftUI 4 提供新 API ,证明 onAppear 调用时机是在布局之后、渲染之前。 问题 同之前多篇博客类似,我们还是 聊天室 一个 问题开始。...在一个视图生存期中,SwiftUI 可能会多次创建视图实例。 由于惰性视图优化机制,对于尚未处于可见区域子视图,SwiftUI 不会创建其实例 求值 一个被显示视图至少会经历一次过程。...这会让开发者误以为 onAppear 是在视图渲染后( 使用者看到后 )才被调用。但在 SwiftUI onAppear 实际上是在渲染前被调用。...在写 SwiftUI 视图生命周期研究[6] 一文时,我们只能通过现象来推断 onAppear 调用时机,随着版本不断提高,SwiftUI 4 为我们提供了足够工具让我们可以获得更加确实证据...newWords 为空,但也不会有问题 完成布局 调用 onAppear 闭包,给 newWords 赋值 由于 newWords 是该视图 Source of truth ,发生改变后,导致视图重新刷新

1.1K10

onAppear 调用时机

本文将通过 SwiftUI 4 提供新 API ,证明 onAppear 调用时机是在布局之后、渲染之前。问题同之前多篇博客类似,我们还是 聊天室 一个 问题 开始。...在一个视图生存期中,SwiftUI 可能会多次创建视图实例。由于惰性视图优化机制,对于尚未处于可见区域子视图,SwiftUI 不会创建其实例求值一个被显示视图至少会经历一次过程。...这会让开发者误以为 onAppear 是在视图渲染后( 使用者看到后 )才被调用。但在 SwiftUI onAppear 实际上是在渲染前被调用。...在写 SwiftUI 视图生命周期研究 一文时,我们只能通过现象来推断 onAppear 调用时机,随着版本不断提高,SwiftUI 4 为我们提供了足够工具让我们可以获得更加确实证据。...newWords 为空,但也不会有问题完成布局调用 onAppear 闭包,给 newWords 赋值由于 newWords 是该视图 Source of truth ,发生改变后,导致视图重新刷新重复上面的过程

2K20

SwiftUI 视图生命周期研究

类型树在编译后就已经固定,在 app 生命周期内都不会发生变化。 视图值树 在 SwiftUI ,视图是状态函数[2]。...但 SwiftUI 并非一定会从新实例获取 body 结果,如果之前实例注册过数据依赖,视图值树仍可能会原来实例 body 获取结果。...除了必要参数设置外,不要做任何多余操作。这样即使 SwiftUI 创建了多余实例,也不会加大系统负担。 注册数据依赖 在 SwiftUI ,状态(或者说是数据)是驱动 UI 动力。...比如,在下面的几个场景onAppear 和 onDisappear 都将违背大多数认知: •在 ZStack ,即使视图不显示,也同样会触发 onAppear,即使消失(不显示),也不会触发 onDisappear...同理,将显示层切换为隐藏层后,该层仍参与布局,因此,ZStack 所有层都会在最开始就触发 onAppear,但不会触发 onDisappear。

4.3K30

UICollectionView iOS 13以下删除动画crash

问题分析 1、crash原因可以知道是UICollectionView在deleteItem时候前后item数量一致;(正常应该是删除前40,删除39) 2、这是某个cell删除逻辑; 3、...用户点击cell跳转界面后,又触发了原来UICollectionViewcell删除动画; slardar(APM)聚合信息,可以看到: 4、最后页面是并不是原来UICollectionView...用iOS 12设备找到复现路径: 先正常触发UICollectionView初始化和cell加载 => UICollectionView触发界面跳转,进入下一级界面 => 触发删除Cell业务逻辑...但是这个reloadData并不会直接触发UICollectionView马上dataSource和delegate去获取数据和UI,而是会等到UICollectionView展示时候再进行触发。...如果UICollectionView不在当前界面,此时这个缓存会失效,但此刻并不会马上调用dataSourcenumberOfItemsInSection:。

1.7K30

SwiftUI 与 Core Data —— 数据获取

而 @FetchRequest 将 app 状态构成很大一部分独立结构实例中分拆出来,散落在多个视图之中。这几年不少开发者也尝试找寻更加符合 Redux 精神替换方案,但效果都不理解。...简单介绍一下我探索过程( 以 TCA 框架进行举例 ):在 Reducer 获取并管理值数据在 task( 或 onAppear通过发送 Action 启动一个长期 Effect ,创建一个...NSFetchedResultsController Core Data 获取指定谓词数据集。...尽管在实践,如果能在确保不访问托管对象非线程安全属性前提下,在非创建托管对象线程持有托管对象并不会出现崩溃情况,但出于谨慎考虑,我最终还是放弃了这种方式。...NSFetchedResultsController 并获取首批数据操作是 onAppear 中发起,由于 TCA Action 处理机制,数据首次显示有可感知延迟( 效果远不如在视图中通过

4.6K30

WWDC2016 Session笔记 - iOS 10 UICollectionView新特性

我们先来看一下之前 UICollectionView 体验,假设我们每个cell都是简单蓝色,实际开发app,cell会比这复杂很多。 我们先生成100个cell。...当用户滑动不是很快时候,还感觉不出来卡顿,当用户大幅度滑动,整个UICollectionView的卡顿就很明显了。如果整个cellDataSource又是网络加载,那就更加卡顿了。...我们来看下图: 上图中曲线我们看着就很平缓了,而且这种情况也不会出现掉帧情况了,每个滑动时间都能达到60帧了。这是怎样做到呢?...至此,我们来看看文章开始到现在,UICollectionView性能提升了多少。我们还是用掉帧方法来看看UICollectionView性能。...在iOS 9,引入了UICollectionViewInteractive Reordering,在今年iOS 10,又加入了一些新API。

1.9K30

SwiftUI + Core Data App 内存占用优化之旅

所谓行缓存,便是指当 Core Data SQLite 获取数据时,首先将数据以接近原始存储格式形式保存在行缓存( 内存 )。...可以直接行缓存获取( 如果可以命中的话 )。...,否则托管上下文并不会给托管对象托管属性( @NSManaged )返回真正数据。...不过通过实验中分析,这些数据肯定是被缓存,且在被加载后,并不会因为返回惰值而自动内存清除 因此,即使我们将托管对象返回成惰值状态,也仅能节省极少内存占用( 在本例几乎可以忽略不计 )。...,由于该 Picture 托管对象仅存活于视图 onAppear block ,闭包执行完毕后,Core Data 会自动释放上下文以及行缓存对应数据。

2.4K40

SwiftUI + Core Data App 内存占用优化之旅

所谓行缓存,便是指当 Core Data SQLite 获取数据时,首先将数据以接近原始存储格式形式保存在行缓存( 内存 )。...可以直接行缓存获取( 如果可以命中的话 )。...,否则托管上下文并不会给托管对象托管属性( @NSManaged )返回真正数据。...不过通过实验中分析,这些数据肯定是被缓存,且在被加载后,并不会因为返回惰值而自动内存清除 因此,即使我们将托管对象返回成惰值状态,也仅能节省极少内存占用( 在本例几乎可以忽略不计 )。...,由于该 Picture 托管对象仅存活于视图 onAppear block ,闭包执行完毕后,Core Data 会自动释放上下文以及行缓存对应数据。

1.2K10

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

引 开发我们最常看到可能是表视图UITableView了,但其实还有一个视图也很常见,特别是一些图片、商品、视频展示界面,用UICollectionView来展现往往会更加方便。...为了显得真实一点,我用了一个随机数来决定每个cell显示图片和文字,这样在呈现时候就不会太过千篇一律。...不同之处在于UICollectionView需要一个布局参数来决定cell是如何布局,默认是流水布局,也就是我们最常见形式,也就是上面图里形式;此外,UICollectionView除了垂直滚动,...和DataSource方法Identifier保持一致,cell只能通过注册来确定重用标识符 [collectionView registerClass:[CollectionViewCell...使用方式,就像UITableView可以简单也可以做非常多样,UICollectionView也是一种乍看很平常但可以容纳非常多想象力布局方式,只要善加利用就可以做出很好效果,当然,什么时候用UICollectionView

1K00

如何在SwiftUI实现interactiveDismissDisabled

3.0新增功能——interactiveDismissDisabled增强版;如何创建更SwiftUI化功能扩展。...需求 由于健康笔记[2]数据录入都是在Sheet中进行,为了防止用户在录入过程由于误操作(使用手势取消Sheet)丢失数据,因此,最初版本开始,我就一直使用各种手段加强对Sheet控制。...原理 委托 iOS 13开始,苹果调整了模态视图委托协议(UIAdaptivePresentationControllerDelegate)。...注入 创建一个空UIView(通过UIViewRepresentable),在其中查找到持有它UIViewController A。...在之前版本[8],用户使用手势取消时通知和其他逻辑是分离,在使用不仅繁琐,而且影响代码观感。本次将一并解决这个问题。

3.8K40

iOS小经验:UITableView&UICollectionView设置单元格默认选中状态

场景需求 一个表格视图(或者宫格视图),当一个单元格被选中时设置彩色样式,选中其它单元格时设置灰色样式。 2. 一个思路 通过实现选中和非选择代理,以在适当时机进行UI更新操作。 3....UICollectionView 4.1 通过屏幕点击改变选中状态回调给代理 //选中 - (void)collectionView:(UICollectionView *)collectionView...cell时候,UITableView并不会执行- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath...,但当屏幕点击选中其它cell时候,也不会执行原cell非选中代理。...相同点在于,手动设置选中时候,都是不会执行didSelect方法

3.5K50

Ask Apple 2022 与 SwiftUI 有关问答(上)

是否有任何建议用来检测列表行选择,类似于 “NavigationLink”,但不导航到另一个视图(例如,显示 Sheet 或列表中选择一个选项 )?...在单元测试,很难对 SwiftUI 视图中依赖( 符合 DynamicProperty 协议 )进行测试。这也是 Redux-like 框架优势之一( 将状态视图中抽离出来,方便测试 )。...在我例子,不拖动时 0 到 75,拖动时 0 到 100。有什么办法可以阻止这种情况吗?A:你可以用 .chartYScale(domain: 0 ... 75) 锁定 Y 轴刻度域。...A:你永远不会看到 @ToolbarBuilder 了,因为 @ToolbarContentBuilder 在 iOS 16 得到了功能增强。...惰性容器视图,会根据其是否出现在可视区域而反复调用 onAppear 和 onDisapper。但 onAppear 和 onDisappear 并非为视图存续期起点和终点。

12.2K20

了解 SwiftUI onChange

在上节例子,尽管 Store date 每三秒会发生一次改变,但并不会引起视图重新绘制。通过点击按钮强制重绘视图,onChange 才会被触发。...多个 onChange 执行顺行 严格按照视图树渲染顺序,下面的代码,onChange 执行顺序为内到外: struct ContentView: View { @State var text...至于允许循环次数没有明确约定,上面例子由 Button 激发变化通常会限制在 2 次,而由 onAppear 激发变化则可能在 6-7 次。...在 task 闭包任务单元足够简单时,其表现同 onChange 类似,相当于 onAppear + onChange 组合。...,因为系统控件并不会因为我们限制了数值修改而产生对应效果(系统控件还保留了一套自己数据,除非强制刷新视图,否则并不会保证同外部数据完全同步)。

2.8K20

Swift 探索 UICollectionView 之 SupplementaryView 和 Decoration View

是否也能这样操作呢!...答案当然是肯定,在 UICollectionView 控件我们管这叫 Supplementary View, 翻译过来就是 "追加视图",那在 UICollectionView 该怎么实现给每个...,它就会与屏幕顶部粘住不会隐藏,具体效果如下: 这效果第一眼看上去是不是感觉有点复杂,这效果起码得撸个百来行代码才能实现这效果啊!...在接下来内容,你将会学到以下知识点: 1.如何在 UICollectionView 创建 Decoration View2.自定义布局属性,计算 section 背景图位置和大小3.实现 UICollectionView...(UIViewController)呈现了,但是为了更进一步体现 UICollectionView 强大,我还实现了一个功能,那就是使得书架里书可以自由拖拽排序,这里就用到了另外一个知识点:手势

1.9K10
领券