2016-07-27 2 views
1

В настоящее время я реализую перетаскивание перетаскивания в виде таблицы в моем приложении OS X. В то время как нормальная прокрутка работает нормально, автопрокрутка при перетаскивании полностью сломана.NSTableView в NSScrollView не выполняет автопрокрутку при перетаскивании

Если я захвачу ячейку и начну перетаскивать, автопрокрутка просто подскажет таблице прокрутить вверх. Если я вручную прокручиваю с помощью трекпада во время перетаскивания, таблица постоянно появляется вверх. Если я перетащил одну из верхних ячеек, таблица не будет автоматически прокручиваться при перетаскивании в нижней части.

Я подклассифицировал NSScrollView и переопределил метод scrollClipView. Я вижу, что он вызывается каким-то внутренним методом автопрокрутки с координатами (0, 0).

enter image description here

Так как я не могу видеть, что это внутренний метод делает, и Goggle и SO не поворачивают вверх ничего, я немного застрял.

Кто-нибудь сталкивался с этим вопросом раньше? Из прошлого опыта у меня такое чувство, что это связано с AutoLayout, но я понятия не имею, что. Или, может быть, это нечто совершенно несвязанное.

Любые идеи по дальнейшему устранению неполадок?

+0

Покажите нам свой код. – Willeke

+0

Какой код вы интересуетесь? Учитывая природу этого приложения, я не могу раскрывать большие части базы кода. Есть ли что-нибудь в частности? –

+0

Меня интересует «Я подклассифицировал NSScrollView и переопределил метод scrollClipView». – Willeke

ответ

2

Я столкнулся с той же проблемой. В моем случае проблема заключалась в том, что я установил высоту NSTableCellView в 10 000 в Interface Builder, чтобы горизонтальные разделители не отображались для пустых строк ниже реальных строк.

Однако фактическая высота моего NSTableCellViews, загруженного во время выполнения, была 43px.

Итак, как только я начал перетаскивать ячейку, чтобы переупорядочить ее, NSScrollView пытался прокручивать 10 000 пикселей за раз, а не 43 за раз.

Это похоже на ошибку, потому что мой подкласс NSOutlineView реализует следующий метод для динамического определения высоты каждой строки.

func outlineView(_ outlineView: NSOutlineView, heightOfRowByItem item: Any) -> CGFloat 

По-видимому, что метод игнорируется механизмом автопрокрутки во время операции перетаскивания, и только значение, установленное в Interface Builder используется.

Поэтому я просто изменил высоту манекена NSTableCellView на 43px в Interface Builder, и я просто буду жить с горизонтальными разделителями, отображаемыми для пустых строк.

+0

Большое спасибо! Это сработало! –

Смежные вопросы