macOS开发 NSScrollView监听滚动条变化 iOS WKWebView监听滚动条变化

App项目有个新需求:进入App,跳出《隐私协议》弹窗,需要浏览完协议内容,才可以点击“确定”按钮。

例如:

分析需求:

macOS中需要监听NSScrollView的右侧滑动条滑动到底部。
iOS中需要监听WKWebView的右侧滑动条滑动到底部。

之所以是这样是因为macOS中的WKWebView没有iOS中的scrollView.delegate

所以macOS用NSScrollView+NSTextView,要是有图片就添加NSImage就好。

macOS中

1.使用NSScrollView

2.NSScrollView的内容视图是NSClipView,旁边的进度条是NSScroller

主要代码,其余的部分自己搞定,界面呀什么的。

@property (nonatomic,strong) NSScrollView *textScrollView;
@property (nonatomic,strong) NSTextView *textView;

//设置懒加载
- (NSTextView*)textView{
    if(!_textView){
        _textView = [[NSTextView alloc]init];
        [self.textScrollView setDocumentView:self.textView];
        _textView.backgroundColor = [NSColor whiteColor];
        _textView.editable = NO;//设置是否可编辑
        _textView.string = @"applicationDidFinishLaunching";
        _textView.textColor = [NSColor blackColor];
        _textView.font = [NSFont systemFontOfSize:12];

    }
    return  _textView;
}


- (NSScrollView*)textScrollView{
    if(!_textScrollView){
        _textScrollView = [[NSScrollView alloc]init];
        [self.view addSubview:self.textScrollView];
       [_textScrollView setBorderType:NSNoBorder];
       [_textScrollView setHasVerticalScroller:YES];
       [_textScrollView setHasHorizontalScroller:NO];
       [_textScrollView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];

    }
    return _textScrollView;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do view setup here.
    
    /** 用户确认书滚动条 */
    CGFloat tSVY = 44;
    CGFloat tSVW = self.view.bounds.size.width;
    CGFloat tSVH = self.view.bounds.size.height - 75;
    CGFloat tSVX = 0;
    self.textScrollView.frame = CGRectMake(tSVX, tSVY, tSVW, tSVH);
    
    /** 用户确认书文档显示 */
    CGFloat tVY = 20;
    CGFloat tVW = self.view.bounds.size.width - 10;
    CGFloat tVH = self.view.bounds.size.height - 10;
    CGFloat tVX = 20;
    self.textView.frame = CGRectMake(tVX, tVY, tVW, tVH);


    [[self.textScrollView contentView] setPostsBoundsChangedNotifications: YES];//发起通知
    //找个合适的地儿,注册通知
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter] ;
        [center addObserver: self
                   selector: @selector(boundsDidChangeNotification:)
                       name: NSViewBoundsDidChangeNotification
                     object: [self.textScrollView contentView]];
}

- (void) boundsDidChangeNotification: (NSNotification *) notification{
    // 在这里进行处理
    NSClipView *changedContentView = [notification object];
    
    // get the origin of the NSClipView of the scroll view that
    // we're watching
    
    NSPoint changedBoundsOrigin = [changedContentView documentVisibleRect].origin;
    //判断滚动条移动高度变化确认是否移动拉动滚动到底
    if (changedBoundsOrigin.y > 560) {
        self.argeeButton.enabled = YES;
    }else{
        self.argeeButton.enabled = NO;
    }
    
}

NSScrollView可以参考另一篇文章https://www.jianshu.com/p/aa420f2f8ef3

NSTextView的属性就可以参考https://blog.csdn.net/tongwei117/article/details/77449497

至于协议部分就不用html了,最好采用json或者XML返回字段或者用文档。.txt或者.doc弄一下macOS的文件操作读取。

macOS的文件操作读取可以参考:http://ios.tedu.cn/data/276105.html

 

 

iOS 当中

1.设置WKWebView里的ScrollerView代理:webView.scrollView.delegate = self;

2.实现ScrollerView的代理方法:- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 或者 - (void)scrollViewDidScroll:(UIScrollView *)scrollView

原理是当ScrollerView的内容高度(contentSize.height)减去偏移量(contentOffset.y)的等于 scrollView 的高度时,说明进度条滑倒底部了

注意:contentSize.height - contentOffset.y 有时候会有小数,不一定准确的恰好等于 scrollView 的高度,但是误差不回超过 1,所以在实际些代码是,可以变通一下。

当 contentSize.height - contentOffset.y 小于 scrollView 的高度 + 1 ; (或者+10,容错率大一些)

 

如下图:

   

scrollView代理方法,二选一:

 

PS:以上监听ScrollerView 偏移量的方法是可行的,如果你的项目不走ScrollerView的代理方法,那么可能是你的web链接出现问题了(将链接换成 https://www.baidu.com 即可证明,确实走了ScrollerView的代理方法)

此处感谢tiger,由于他的支持我完成该任务。

 

posted on 2022-05-05 14:57  高彰  阅读(955)  评论(0编辑  收藏  举报

导航