Как передать события прокрутки родительскому NSScrollView
Мне нужны nstextviews фиксированного размера внутри большего окна прокрутки. IB требует, чтобы textviews были внутри их собственных NSScrollViews, даже если их минимальные/максимальные размеры фиксированы, чтобы они фактически не прокручивались. Когда жесты трекпада выполняются в рамках textview (независимо от того, имеют ли они фокус), они захватываются scrollviews textviews, поэтому ничего не происходит.
Как сообщить scrollviews textviews для передачи событий прокрутки до главного окна функцией ScrollView? (Или, возможно, я должен спросить, как я говорю главному scrollview окна обрабатывать эти события и не передавать их дочерним scrollviews.)
структура IB выглядит так:
- окно
- вид содержимого окна
- big scrollview для окна (желаемая цель для событий прокрутки)
- big scrollview для окна (желаемая цель для событий прокрутки)
- вид содержимого окна
4 ответов
вам не нужно создавать выход "svActive" для отслеживания вашего super scrollview. Просто напишите это предложение в событии scrollWheel:
[[self nextResponder] scrollWheel:event];
это передаст событие следующему ответчику в цепочке ответчика.
IB не требует, чтобы у вас был текстовый вид внутри NSScrollView
; Это просто по умолчанию, потому что большую часть времени вы хотите, чтобы ваш взгляд на свиток. Выберите NSTextView
и выберите Layout > Unembed объекты. Обратите внимание, что после этого момента вы больше не можете перемещать или изменять размер представления в IB. Похоже, это ошибка.
вот пример того, как поставить два NSTextViews
в одном NSScrollView
.
добавьте два вида текста рядом друг с другом; поместите в них текст, чтобы вы могли видеть что происходит?
выберите виды; выберите макет > вставить объекты в > вид прокрутки. Это помещает их в общий NSView
внутри NSScrollView
.
выберите текстовые представления; выберите макет > распакованные объекты.
выключите пружины и распорки (автоматическое изменение размера) для каждого вида текста, чтобы они не изменялись при сжатии вида прокрутки.
обратите внимание на высоту представления документа (здесь 175).
сделайте вид прокрутки меньше. Это также изменяет размер представления документа (NSView
).
восстановите вид документа до его исходного размера (я установил высоту обратно в 175).
готово! Прокрутка работает так, как вы ожидаете.
Это действительно неловко. После нескольких недель откладывания я сделал первую попытку заставить подкласс NSScrollView вести себя пассивно - и оказалось, что это не проблема.
вот подкласс:
H-файл:
#import <Cocoa/Cocoa.h>
@interface ScrollViewPassive : NSScrollView {
// This property is assigned a ref to windowController’s main scrollview.
NSScrollView *svActive;
}
@property (nonatomic, retain) NSScrollView *svActive;
@end
M файл:
#import "ScrollViewPassive.h"
@implementation ScrollViewPassive
@synthesize svActive;
// Pass any gesture scrolling up to the main, active scrollview.
- (void)scrollWheel:(NSEvent *)event {
[svActive scrollWheel:event];
}
@end
нет необходимости делать выходы для этих пассивных scrollviews; я даю им свои ссылки на основной scrollview сразу после того, как их xibs назначаются в качестве содержимого NSBox:
[self.boxDisplayingTextViews setContentView:self.subviewCtllr1.view];
// A textview's superview's superview is its scrollview:
((ScrollViewPassive *)[[self.subviewCtllr1.textview1 superview] superview]).svActive = self.scrollviewMain;
вот именно. Работает как заклинание.
Я считаю, что IB3 и Xcode4 оба борются с вами, если вы пытаетесь сделать это напрямую, но вы можете сделать это косвенно. Сначала перетащите textview из scrollview и удалите scrollview. Вы закончите с осиротевшим textview. Я не знаю, как заставить ИБ позволить тебе положить это в окно, но это будет в твоем пере. Теперь прикрепите к нему IBOutlet и во время выполнения сделайте addSubview:
и отрегулируйте его кадр, чтобы переместить его в любой scrollview вы хотели, чтобы он был.
в моем опыт, наконечники-это хорошо, но каждый сложный наконечник, с которым я когда-либо работал, нуждался в окончательной перестройке кода.