如果判断NSScrollView滚动到了最后

本文详细介绍了如何使用Objective-C代码判断NSTextView是否滚动到末尾,通过获取滚动视图的高度与文本视图的高度比较,从而实现该功能。

转自:http://www.codexsoftware.co.uk/blog/computers/programming/how-to-determine-if-an-nstextview-is-scrolled-to-the-end/


bool scrollToEnd = YES;
 
id scrollView = (NSScrollView *)textView.superview.superview;
if ([scrollView isKindOfClass:[NSScrollView class]]) {
    if ([scrollView hasVerticalScroller]) {
        if (textView.frame.size.height > [scrollView frame].size.height) {
            if (1.0f != [scrollView verticalScroller].floatValue)
                scrollToEnd = NO;
        }
    }
}

在 macOS 开发中,`NSScrollView` 本身没有直接提供判断滚动到特定位置的 API,但可以通过以下方式实现: ### 核心方法 1. **监听 `contentView` 的滚动事件** 通过 `NSScrollView` 的 `contentView`(类型为 `NSClipView`)的 `bounds` 或 `documentVisibleRect` 属性,结合 `NSViewBoundsDidChangeNotification` 通知来跟踪滚动位置。 2. **计算可见区域** 使用 `documentVisibleRect` 获取当前可见的文档区域,结合文档总大小(`documentView.frame`)判断是否滚动到顶部、底部或特定位置。 ### 示例代码 ```swift // 假设 scrollView 是你的 NSScrollView 实例 if let clipView = scrollView.contentView as? NSClipView { // 添加监听 NotificationCenter.default.addObserver( forName: NSView.boundsDidChangeNotification, object: clipView, queue: nil ) { [weak self] _ in guard let self = self else { return } let visibleRect = clipView.documentVisibleRect let documentSize = clipView.documentView?.frame.size ?? .zero // 判断是否滚动底部(阈值可调整) if visibleRect.maxY >= documentSize.height - 10 { print("已滚动底部附近") } // 判断是否滚动到顶部 if visibleRect.minY <= 10 { print("已滚动到顶部附近") } } } ``` ### 其他方法 - **使用 `NSScrollViewDelegate`** 虽然 `NSScrollView` 没有直接委托方法,但可以通过其 `contentView` 的委托(需子类化 `NSClipView`)监听滚动。 - **KVO 监听 `bounds`** 对 `contentView.bounds` 属性添加 KVO 监听(需在 `deinit` 中移除)。 ### 注意事项 - 记得在适当时候(如视图销毁时)移除通知或 KVO 监听,避免内存泄漏。 - 阈值(如 `10`)可根据需求调整,避免因像素误差导致误判。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值