NSScrollView 检测滚动位置

2024-04-16

当滚动在底部时如何检测滚动位置?

[[_scrollView contentView] setPostsBoundsChangedNotifications:YES];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(boundsDidChangeNotification:)
                                             name:NSViewBoundsDidChangeNotification
                                           object:[_scrollView contentView]];





- (void) boundsDidChangeNotification: (NSNotification *) notification
{
    NSPoint currentScrollPosition = [[_scrollView contentView] bounds].origin;
}

Update:
我原来的答案是完全错误的。
感谢 JWWalker 和 Wil Shipley 通过评论让我意识到这一点。

希望对于通过搜索来到这里的人们来说,这是一个更有帮助的答案:
Unlike UIScrollView, NSScrollView不提供委托方法来通知您视图何时滚动到顶部/底部。
要检测这些情况,您必须启用boundsDidChange通知并订阅它们。

当收到边界更新时,您可以检查是否y剪辑视图边界的坐标是0(= 底部),或者剪辑视图边界的顶部边缘与文档视图对齐(= 顶部)。

private func configureScrollView() {
        self.scrollView.contentView.postsBoundsChangedNotifications = true
        NotificationCenter.default.addObserver(self, selector: #selector(contentViewDidChangeBounds), name: NSView.boundsDidChangeNotification, object: self.scrollView.contentView)
    }

@objc
func contentViewDidChangeBounds(_ notification: Notification) {
    guard let documentView = scrollView.documentView else { return }

    let clipView = scrollView.contentView
    if clipView.bounds.origin.y == 0 {
        print("bottom")
    } else if clipView.bounds.origin.y + clipView.bounds.height == documentView.bounds.height {
        print("top")
    }
}

对于使用弹性滚动的滚动视图,更新会出现短暂的延迟,因为剪辑视图似乎推迟了边界更改通知,直到滚动弹跳完成。

您可以使用您的可见矩形NSScrollView的 contentView 而不是边界:

- (void)boundsDidChangeNotification:(NSNotification*) notification
{
    NSRect visibleRect = [[_scrollView contentView] documentVisibleRect];
    NSLog(@"Visible rect:%@", NSStringFromRect(visibleRect));
    NSPoint currentScrollPosition = visibleRect.origin;
}

内容视图边界在滚动期间不会更改,因此在原始代码中,bounds.origin 可能始终返回 0/0。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSScrollView 检测滚动位置 的相关文章

  • 在集合视图单元格中播放视频,就像在 Facebook 应用程序时间轴中播放的视频一样

    我想在集合视图单元格中播放视频 要求就像 Instagram 时间线 播放视频就像在 facebook 时间线中播放视频 为此 我使用了 UICollectionViewCell 我有一些图像 没有视频 现在我是来自画廊的图像 我正在使用相
  • 获取本周的第一天和最后一天

    如何获取本周的第一天和最后一天 我需要的是某种方法来过滤一组具有 NSDate 属性的对象 只留下本周出现的对象 然后按天过滤它们 我还需要一些方法来获取本地化的日期名称 我尝试使用 NSCalendar NSDate 和 NSDateCo
  • Objective-C 使用字符串池吗?

    我知道Java https stackoverflow com questions 3801343 what is string pool in java and C http msdn microsoft com en us librar
  • [[NSMutableDictionary alloc] initWithObjects:...] 和 [NSMutableDictionary DictionaryWithObjects:...] 之间的区别?

    仍在学习 Objective C iPhone SDK 我想我知道为什么这不起作用 但我只是想确认一下 In awakeFromNib 如果我使用 NSMutableDictionary alloc initWithObjects 它实际上
  • 比较 Objective C 中的 NSNumber

    我是 Objective C 的初学者 对这种情况有点困惑 我有以下代码 if number1 lt number2 NSLog THE FOLLOWING NUMBER NSLog number1 NSLog IS LESS THAN N
  • 如何用Block简化回调逻辑?

    假设我需要与一个提供协议的类进行通信 并在操作完成时调用委托方法 如下所示 protocol SomeObjectDelegate required void stuffDone id anObject void stuffFailed e
  • 当自定义子视图处理触摸时防止 UITableView 滚动

    在我的 iOS 应用程序中 有一个 UITableView 其中一个单元格中包含一个自定义子视图 该单元格是一个交互式视图 它处理触摸事件 touchesBegan touchesEnded touchesMoved 以更新自身 问题是 当
  • 检查系统时间是自动还是用户设置

    我需要在当前的项目中设置用户证明时间 我围绕这个问题发现了很多不同的问题 但似乎没有一个问题有我正在寻找的答案 这些是我到目前为止看过的问题 XCODE 如何从设备获取 验证准确的时间戳 https stackoverflow com qu
  • malloc:***错误:已释放对象的校验和不正确 - 对象可能在释放后被修改

    我的 iOS 应用程序有一个大问题 它有时会崩溃 而没有详细的调试错误 堆栈跟踪为空 这是堆栈跟踪中仅有的两行 UIApplicationMain 中的 符号存根 UIHostedTextServiceSession DismissText
  • 使用 UIKeyCommand 检测删除键

    任何人都知道如何使用检测 删除 键UIKeyCommand在 iOS 7 上 当人们在使用 Swift 时遇到问题时 我认为用 Objective C 和 Swift 编写一个小型的 完整的例子可能是一个很好的答案 请注意 Swift 没有
  • let/var 如何解决可变性? [复制]

    这个问题在这里已经有答案了 我没有任何问题 我只是想对有关可变性的问题进行一些澄清 在 Objective C 中我们会使用例如NSMutableArray得到一个可变数组和NSArray得到一个不可变的 我对两者的内部运作了解不多 但据我
  • UISlider不会自动重绘

    我的应用程序上有一个 UISlider 有时我不仅需要更新它的值 还需要更新它的minimumValue 值已更改 但如果我调用 setValue 方法或为滑块分配新值 它会具有新值 但滑块不会将自身重新绘制到该新值应有的位置 我怎样才能重
  • 使用自动布局、IB 和字体大小时表头视图高度错误

    我正在尝试为我的 uiTableView 创建一个标题视图 不是节标题 我已经有了 我已经在界面生成器中设置了一个 XIB 所有的连接都已连接好并且运行良好 除了桌子没有给它足够的空间 我的问题是表格顶部与表格标题有一点重叠 我的 XIB
  • Objective C 中类别是如何实现的?

    作为一名程序员 我知道如何使用类别 但我很好奇它们是如何实现的 编译器是否将它们编译为对类替换方法 http developer apple com library mac documentation Cocoa Reference Obj
  • 如何编辑应用程序包中的文件?

    在我的应用程序中 我从存储在捆绑资源中的 CSV 文件加载数据 但是 我希望能够在用户点击 更新 按钮时以编程方式更新此文件 有没有办法以编程方式更改应用程序包中的资源 这是我用来访问该文件的代码 NSString path NSBundl
  • 检查 Objective-C 块类型?

    这主要是出于好奇 我不太确定它的实际用途是什么 但就这样吧 由于块也是 Objective C 对象 是否可以检查它们的类型 也就是说 它是否响应isKindOfClass 消息以及如何使用该消息来处理块 我天真的以为事情大概是这样的 vo
  • 带有文本字段的 iPhone AlertView

    我有一个UIAlertView with a UITextField在里面 我想输入mail id并提交于UIAlertView s ok按钮 但是UITextField in the UIAlertView没有回复 请帮助我 thankz
  • 如何将自定义 C 代码放入 SwiftPM 包中?

    我正在尝试将 C 代码打包到 Swift 模块中 我们称之为CModule 一旦我将其放入项目的基本文件夹中 Swift模块 并配置了搜索路径 我可以在 Swift 文件中自动完成工作 并检测错误 警告 问题是 导入时它无法识别该模块 并且
  • WiFi 网络变化是否有 NSNotificationCenter 通知?

    我想在我的 Cocoa 应用程序中订阅 WiFi 网络更改 但我无法找到合适的事件来订阅 WiFi 网络变化是否有 NSNotificationCenter 通知 据我所知 我会用CoreWLAN https developer apple
  • 对象指针值作为字典的键

    我想使用对象的引用值作为字典的键 而不是对象值的副本 因此 我本质上想在字典中存储与另一个对象的特定实例关联的对象 并稍后检索该值 这可能吗 是不是完全违背了NSDictionary的理念 我可以看出我可能以错误的方式处理这个问题 因为字典

随机推荐

  • Swift:MKAnnotation 长标题文本

    我有很长的 MKannotationView 标题文本 有没有一种简单的方法可以使标题中的文本大小合适 reuseId Pin var pinView mapView dequeueReusableAnnotationViewWithIde
  • 如何在滚动更改事件上获取android滚动视图的第一个可见子项

    我想在每个滚动更改事件上从 android 滚动视图获取第一个可见的子视图 就像 当我们向下滚动时 我们会得到所有即将在屏幕上可见的视图 ID 或引用 如何 我自己得到了它 这是我的代码 在这里 我们需要创建自定义回调监听器 在其 onSc
  • 如何更改列的 CSS - ReactTable

    我在用反应表 https www npmjs com package react table installation在我的应用程序中 我坚持做一件事 即改变CSS of columns当调整列大小时 目前当你resize仅一列cursor
  • Android 5.0(Lollipop)小部件按钮的文本全部大写[重复]

    这个问题在这里已经有答案了 我有一个简单的主屏幕小部件 上面有几个按钮 我的问题是 当小部件在 Lollipop 上运行时 按钮的文本全部大写 任何以前的 Android 版本都没有这个问题 layout xml 中的按钮是非常普通的按钮
  • 在 Swift 中捕获 NSException

    Swift 中的以下代码引发 NSInvalidArgumentException 异常 task NSTask task launchPath SomeWrongPath task launch 我怎样才能捕获异常 据我了解 Swift
  • 为什么此 SQL 存储过程需要创建临时表才能工作(返回结果)?

    IBM Informix 动态服务器版本 11 50 FC6 我正在开发一个小型存储过程 该过程将从表中获取名称字段并将它们解析为最多 8 个字符的 用户名 这是我正在尝试的代码 CREATE PROCEDURE build jics us
  • Android TCP 连接最佳实践

    我正在开发一个需要 TCP 连接到 TCP 服务器的 Android 应用程序 用 Node js 编写 我的 Android TCP 客户端正在工作 可以来回发送消息 我的具体问题是 在 Android 中处理与服务器的 TCP 连接的最
  • 如何在单元格 Swift 2 中删除项目后重新加载表格视图

    我有一个帐户列表TableView 按下按钮后 项目将被删除 到目前为止 一切都很好 删除后如何刷新tableView 请查看下面的屏幕截图以获取更多信息 TableView在另一个ViewController中 要删除的按钮在ViewCo
  • 删除数组中第一级标识符[重复]

    这个问题在这里已经有答案了 我认为这个问题以前已经出现过 但找不到任何答案 如果已经回答 请通过链接为我指出正确的方向 我有一个数组 我不想删除第一级标识符 我想有一个函数可以实现这个功能吗 它是如何的示例 0 gt Array 8 gt
  • 如何从数字列表中获取字符串?

    我有一个 Erlang 符号列表 104 105 106 107 如何从此列表中获取字符串 hijk Erlang 中不存在字符串这种数据类型 Stings 只是字符列表 104 105 106 107 and hijk 是完全等价的 事实
  • Facebook SDK:应用程序未注册为 URL 方案

    我正在使用Facebook SDK found here http components xamarin com view facebookios 并且正在尝试提供的示例 在文件夹中FacebookiOSSample 如果我简单地替换App
  • 如何检查一个类没有参数构造函数

    Object obj new Object try obj getClass getConstructor catch SecurityException e e printStackTrace catch NoSuchMethodExce
  • 重新创建一棵扁平的树

    我有一个地图向量 我想以嵌套方式对其进行转换 数据结构如下 def data id 1 name a parent 0 id 2 name b parent 0 id 3 name c parent 0 id 4 name a 1 pare
  • 如何在 Backbone.js 中加载具有外键关系的子模型?

    抱歉 如果这有点复杂 我仍在学习 Backbone js 加载和保存内部具有子模型的 Backbone 模型的正确方法是什么 我什至应该有子模型吗 例如 请原谅咖啡脚本 如果我有类似的东西 class Address extends Bac
  • 运行为包:不可调试

    我正在尝试从我的 Android 设备 运行 One UI 2 0 的非 root Exynos Galaxy S9 中提取数据库文件 每次打开 Android Studio 3 6 2 gt 设备文件资源管理器时 我都会收到消息 run
  • 如何告诉 Json.NET 忽略第 3 方对象中的属性?

    Json NET 文档说你使用JsonIgnore不要序列化类中的某些属性 public class Account public string FullName get set public string EmailAddress get
  • Azure 应用服务默认超时值是什么以及在哪里?

    是否可以使用门户 Powershell CLI 在 Azure 中查看或更改 Azure 应用服务的默认超时 这是常规设置的参考 我找不到 根据穆贡丹 拉文德兰 https learn microsoft com en us answers
  • 如何使 java.awt.FileDialog 在屏幕上居中

    我一直无法弄清楚这个问题 通常的嫌疑人不起作用 Given FileDialog dlg null dlg new FileDialog owner Select File to Load FileDialog LOAD dlg setFi
  • 将子视图添加到 UITableViewCell

    当我向 UITableViewCell 添加子视图时遇到问题 当表格尺寸低于 iPhone 尺寸时 它可以工作 但是当尺寸更大时 当我滚动时会产生一些可怕的效果 它应该是这样的 Then I think it comes from the
  • NSScrollView 检测滚动位置

    当滚动在底部时如何检测滚动位置 scrollView contentView setPostsBoundsChangedNotifications YES NSNotificationCenter defaultCenter addObse