Это не самое лучшее, но это работает в моем случае. Я думаю, что это можно сделать немного чище с помощью некоторых манипуляций с NSEvent, но я понял, что могу проверить, начал ли пользователь выполнять прокрутку, проверив текущую позицию прокрутки по общей высоте прямоугольника документа.
NSRect totalRect = [[serialScrollView contentView] documentRect];
NSRect visibleRect = [[serialScrollView contentView] documentVisibleRect];
NSInteger totalHeight = totalRect.size.height;
NSInteger visibleHeight = visibleRect.size.height;
NSInteger position = visibleRect.origin.y;
NSInteger scrollPoint = position + visibleHeight;
if (totalHeight != scrollPoint)
[autoscrolls setState:0];
Таким образом, в основном, если позиция прокрутки становится чем-то отличным от того, что программа ожидает от программных записей, она отключает автоматическую прокрутку. Крутая вещь в этой реализации заключается в том, что если вы рекламируете else [autoscrolls setState:1];
, то при включении прокрутки вниз включается автопрокрутка, чтобы наверстать упущенное. Это имитирует поведение прокрутки в терминале, когда вы запускаете сценарий оболочки с большим количеством выходных данных, например yum install
в Fedora или чем-то подобным.