2010-01-13 1 views
3

Я пытаюсь использовать IKImageViewDemo, предоставленный apple (http://developer.apple.com/mac/library/samplecode/IKImageViewDemo/index.html), и я пытаюсь добавить к нему прокрутки. Я пробовал две вещи:IKImageView и полосы прокрутки

1) внедрение IKImageView в ScrollView. У этого были все виды странных эффектов, например, изображение больше не было там, где должно было быть, и полосы прокрутки, казалось, находились в фиксированном месте, независимо от того, насколько велика была окно (чтобы я мог сжать окно и потерять полосы прокрутки , хотя 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); 

печать б 1 скроллеры 0?

ответ

8

Одна вещь, которая, возможно, зацепила вас в IKImageViewDemo, заключалась в том, что изображение было увеличено до уровня windowDidResize: ([_imageView zoomImageToFit: self]).

Внедрение IKImageView в NSScrollView - это правильная вещь. Чтобы заставить полосы прокрутки следовать за окном при изменении размера, вам необходимо настроить пружины и распорки (== авторезистирующая маска) в Interface Builder.

Приложение: Как вы заметили, в 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 с полосы прокрутки и выше обходной путь.

+0

спасибо! Я отключил окно, изменив размер объекта ... Проблема с этим (что у меня также была в моей собственной версии). Если вы сделаете окно достаточно маленьким, чтобы изображение было больше окна в размерах BOTH, полосы прокрутки исчезают. Пока край изображения находится внутри окна (включая полосы прокрутки, если они есть) в X или Y, тогда полосы прокрутки появляются, но если вы сжимаете его, они исчезают! любые мысли по этому поводу? –

+0

Это, похоже, ошибка в Mac OS X 10.6 с IKImageView и автогидрой прокрутки. В 10.5 (где я писал и тестировал его вчера) оба полосы прокрутки появляются, когда вы делаете окно меньше; но они оба исчезают на 10.6, как только вы выходите за ширину полосы прокрутки (даже с двоичным кодом, построенным на 10.5). В 10.6 мой код работает, если вы установили _imageView.autohidesScrollers = NO; хоть. Я посмотрю, смогу ли я найти способ обхода проблемы. –

+0

ОК, обходное решение опубликовано. Вау, это было неприятно. –