macOS点击按钮控制行上下滚动的UI设计最优方案咨询
你要实现的类似UI效果参考:
最优方案选型
优先选择NSTableView实现,相比其他方案优势非常明显:
- 原生支持行视图复用,行数超过100时性能远优于手动排布NSView或NSStackView(StackView会全量加载所有子视图到内存,行数多了会出现卡顿)
- 自动处理行布局、间距适配,不需要自行计算每行Y轴坐标,后续迭代维护成本更低
- 原生支持行选中、高亮、自定义内容视图,和你当前自定义行NSView的现有方案兼容,只需要把已开发的行视图放入
NSTableCellView的contentView中即可直接复用
限制仅按钮触发滚动的实现方法
第一步:禁用所有默认滚动行为
- 隐藏NSTableView外层
NSScrollView的垂直滚动条:scrollView.hasVerticalScroller = false - 子类化NSScrollView,重写
scrollWheel:方法,直接return不调用父类实现,即可拦截鼠标滚轮、触控板滑动触发的滚动 - 关闭表格选中自动滚动特性:
tableView.autoscrollToSelectedItem = false
第二步:实现上下箭头按钮的滚动逻辑
- 上滚一行:获取当前可见区域的首行索引,调用
scrollRowToVisible:滚动到上一行索引,注意判断边界不可小于0 - 下滚一行:获取当前可见区域的末行索引,调用
scrollRowToVisible:滚动到下一行索引,注意判断边界不可超过总行数-1 - 如果需要整页滚动,可通过当前可见行数计算偏移量,再调用
scrollRowToVisible:实现即可
备选轻量方案
如果你的场景行数极少(不超过20行),也可以用NSStackView实现:
- 将所有自定义行视图加入垂直NSStackView,把StackView放入固定高度的父视图容器中
- 点击上下按钮时直接修改StackView的origin.y坐标,同时限制坐标的最大最小值避免滚动超出内容范围
- 该方案实现更简单,但没有视图复用能力,行数多了性能会明显下降,仅适合少量行的场景使用
内容的提问来源于stack exchange,提问作者niravdesai21
相关产品推荐
相关产品推荐

