不让scrollview自动调整scrollview的 inset,在滑动过程中不会发生偏移量的改变

本文介绍如何通过设置self.automaticallyAdjustsScrollViewInsets=false来自动调整scrollview的inset,避免在不同界面元素高度变化时导致的viewController布局问题。主要涉及statusbar、navigationbar和tabbar高度的自定义调整,确保布局一致性。
//根据按所在界面的status bar,navigationbar,与tabbar的高度,自动调整scrollview的 inset,设置为no或者false,不让viewController自己调整,我们自己的布局是怎样就是怎样
    self.automaticallyAdjustsScrollViewInsets = false;

import Cocoa import SnapKit class MessageDemoController: NSViewController { private var scrollView1 = NSScrollView() private var scrollView2 = NSScrollView() private var messageListView1 = TPGuardMessageListView() private var messageListView2 = TPGuardMessageListView() private var toggleButton1 = NSButton() private var toggleButton2 = NSButton() private var contentView = NSView() // 新增容器视图 private var messageListContainerView = NSView() private var demoMessages1: [TPGuardDeviceShareMessage] = { var messages = [TPGuardDeviceShareMessage]() for i in 1...3 { let message = TPGuardDeviceShareMessage() message.messageID = "msg_\(i)" message.messageType = (i % 2 == 0) ? .deviceShareIPC : .deviceShareNVR message.content = "User \(i) wants to share a device with you." message.sharerUserName = "user\(i)" message.deviceModel = "Model-\(i)" message.deviceName = "Device-\(i)" message.time = Date().timeIntervalSince1970 - TimeInterval(i * 3600) message.expiry = message.time + 86400 messages.append(message) } return messages }() private var demoMessages2: [TPGuardDeviceShareMessage] = { var messages = [TPGuardDeviceShareMessage]() for i in 1...5 { let message = TPGuardDeviceShareMessage() message.messageID = "msg2_\(i)" message.messageType = (i % 2 == 0) ? .deviceShareIPC : .deviceShareNVR message.content = "User \(i) wants to share a device with you." message.sharerUserName = "user\(i)" message.deviceModel = "Model-\(i)" message.deviceName = "Device-\(i)" message.time = Date().timeIntervalSince1970 - TimeInterval(i * 3600) message.expiry = message.time + 86400 messages.append(message) } return messages }() override func loadView() { view = NSView(frame: NSRect(x: 0, y: 0, width: 400, height: 700)) view.wantsLayer = true view.layer?.backgroundColor = NSColor.clear.cgColor view.addSubview(contentView) contentView.wantsLayer = true contentView.layer?.backgroundColor = NSColor.clear.cgColor } override func viewDidLoad() { super.viewDidLoad() setupUI() setupConstraints() loadDemoData() } private func setupUI() { contentView.addSubview(messageListView1) scrollView2.translatesAutoresizingMaskIntoConstraints = false scrollView2.hasVerticalScroller = true scrollView2.hasHorizontalScroller = false scrollView2.drawsBackground = false // 配置容器视图 messageListContainerView.translatesAutoresizingMaskIntoConstraints = false messageListContainerView.addSubview(messageListView2) scrollView2.documentView = messageListContainerView // 设为documentView contentView.addSubview(scrollView2) messageListView1.translatesAutoresizingMaskIntoConstraints = false messageListView1.messageListViewStatusDidChangeCallback = { [weak self] height, isCollapsed in self?.view.layoutSubtreeIfNeeded() } messageListView2.translatesAutoresizingMaskIntoConstraints = false messageListView2.messageListViewStatusDidChangeCallback = { [weak self] height, isCollapsed in self?.view.layoutSubtreeIfNeeded() // 触发根视图重新布局 } print("真的走到这里了2") toggleButton1.title = "Toggle Collapse" toggleButton1.bezelStyle = .rounded toggleButton1.target = self toggleButton1.action = #selector(toggleListState) toggleButton1.translatesAutoresizingMaskIntoConstraints = false contentView.addSubview(toggleButton1) toggleButton2.title = "Toggle List 2" toggleButton2.bezelStyle = .rounded toggleButton2.target = self toggleButton2.action = #selector(toggleList2State) toggleButton2.translatesAutoresizingMaskIntoConstraints = false contentView.addSubview(toggleButton2) } private func setupConstraints() { contentView.snp.makeConstraints { make in make.edges.equalToSuperview() make.width.equalTo(420) make.bottom.equalTo(toggleButton2).offset(20) } messageListView1.snp.makeConstraints { make in make.top.equalTo(contentView).offset(20) make.leading.trailing.equalTo(contentView) } scrollView2.snp.makeConstraints { make in make.top.equalTo(messageListView1.snp.bottom).offset(10) make.leading.trailing.equalTo(contentView) make.height.lessThanOrEqualTo(300) // 设置初始高度 } // 容器视图约束 messageListContainerView.snp.makeConstraints { make in make.edges.equalToSuperview().inset(0)// 仅固定宽度 make.width.equalTo(scrollView2.contentView) } // MessageListView2在容器内的约束 messageListView2.snp.makeConstraints { make in make.edges.equalToSuperview() make.width.equalTo(messageListContainerView) } toggleButton1.snp.makeConstraints { make in make.top.equalTo(scrollView2.snp.bottom).offset(20) make.leading.equalTo(contentView).offset(40) } toggleButton2.snp.makeConstraints { make in make.top.equalTo(toggleButton1) make.trailing.equalTo(contentView).offset(-40) } } private func loadDemoData() { NSAnimationContext.runAnimationGroup({ context in context.duration = 0 context.allowsImplicitAnimation = false messageListView1.deviceShareMessages = demoMessages1 messageListView2.deviceShareMessages = demoMessages2 messageListView1.reloadMessages() messageListView2.reloadMessages() }) } @objc private func toggleListState() { messageListView1.toggleCollapseState() } @objc private func toggleList2State() { messageListView2.toggleCollapseState() } } 能不能帮我写一些调试打印,每次点击展开或收起后输出messagelist2的frame、bounds、每张卡片的frame信息?我要检查排布问题,同时讲一下bounds和frame的区别
最新发布
09-29
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值