IKImageView и полосы прокрутки
-
20-09-2019 - |
Вопрос
Я пытаюсь использовать IKImageViewDemo, предоставленный Apple (http://developer.apple.com/mac/library/samplecode/IKImageViewDemo/index.html), и я пытаюсь добавить к нему полосы прокрутки.Я пробовал две вещи:
1) встраивание IKImageView в ScrollView.Это имело множество странных эффектов, например, изображение больше не находилось там, где оно должно было быть, а полосы прокрутки, казалось, находились в фиксированном месте, независимо от того, насколько велико было окно (поэтому я мог сжать окно и потерять полосы прокрутки). , хотя размер прокрутки был настроен на изменение размера вместе с окном)
2) Я добавил [_imageView setHasHorizontalScrollers:YES] (и вертикально) в код метода openImageURL.Похоже, это ничего не дало.
Я упускаю что-то очевидное?
Кроме того:Почему
NSLog(@"scrollbar? H %d V %d hide %d",
_imageView.hasHorizontalScroller,
_imageView.hasVerticalScroller,
_imageView.autohidesScrollers);
_imageView.hasHorizontalScroller = YES;
_imageView.hasVerticalScroller = YES;
_imageView.autohidesScrollers = YES;
NSLog(@"scrollbar? H %d V %d hide %d",
_imageView.hasHorizontalScroller,
_imageView.hasVerticalScroller,
_imageView.autohidesScrollers);
дай мне:
scrollbar? H 0 V 0 hide 0
scrollbar? H 0 V 0 hide 0
?
Дополнительно дополнительно:
Аналогично, почему:
BOOL b = _imageView.autohidesScrollers = YES;
NSLog (@"b %d scrollers %d", b, _imageView.autohidesScrollers);
напечатать b 1 скроллеры 0 ?
Решение
Одна вещь, которая, возможно, вас зацепила в IKImageViewDemo, заключалась в том, что изображение было увеличено, чтобы поместиться в windowDidResize:
метод ([_imageView zoomImageToFit: self]
).
Встраивание IKImageView в NSScrollView — это правильный поступок.Чтобы полосы прокрутки следовали за окном при изменении его размера, вам необходимо настроить пружины и стойки (== маску автоматического изменения размера) в Интерфейсном Разработчике.
Приложение: Как вы заметили, в Mac OS X 10.6 есть ошибка, из-за которой она не работает должным образом.Эту проблему можно обойти, создав подкласс NSScrollView следующим образом:
@interface IKImageClipView : NSClipView
- (NSRect)docRect;
@end
@implementation ScrollViewWorkaround
- (void)reflectScrolledClipView:(NSClipView *)cView;
{
NSView *_imageView = [self documentView];
[super reflectScrolledClipView:cView];
if ([_imageView isKindOfClass:[IKImageView class]] &&
[[self contentView] isKindOfClass:[IKImageClipView class]] &&
[[self contentView] respondsToSelector:@selector(docRect)]) {
NSSize docSize = [(IKImageClipView *)[self contentView] docRect].size;
NSSize scrollViewSize = [self contentSize];
// NSLog(@"doc %@ scrollView %@", NSStringFromSize(docSize), NSStringFromSize(scrollViewSize));
if (docSize.height > scrollViewSize.height || docSize.width > scrollViewSize.width)
((IKImageView *)_imageView).autohidesScrollers = NO;
else
((IKImageView *)_imageView).autohidesScrollers = YES;
}
}
@end
Попробуйте это:
http://dl.dropbox.com/u/1583683/IKImageViewDemo.zip
Это версия IKImageViewDemo с полосами прокрутки и описанным выше обходным решением.