IKImageView和滚动条

Bri*_*tow 3 macos objective-c interface-builder ikimageview

我正在尝试使用apple提供的IKImageViewDemo(http://developer.apple.com/mac/library/samplecode/IKImageViewDemo/index.html),我正在尝试向其中添加滚动条.我尝试了两件事:

1)在ScrollView中嵌入IKImageView.这有各种奇怪的效果,比如图像不再位于应有的位置,滚动条似乎在一个固定的位置,无论窗口有多大(所以我可以缩小窗口并丢失滚动条,即使scrollview设置为使用窗口调整大小)

2)我将[_imageView setHasHorizo​​ntalScrollers: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);
Run Code Online (Sandbox Code Playgroud)

给我吗:

scrollbar? H 0 V 0 hide 0
scrollbar? H 0 V 0 hide 0
Run Code Online (Sandbox Code Playgroud)

另外还有:

同样为什么:

 BOOL b = _imageView.autohidesScrollers = YES;
 NSLog (@"b %d scrollers %d", b, _imageView.autohidesScrollers);
Run Code Online (Sandbox Code Playgroud)

print b 1 scrollers 0?

Nic*_*ley 8

在IKImageViewDemo中可能引起注意的一件事是图像被缩放以适合windowDidResize:方法([_imageView zoomImageToFit: self]).

在NSScrollView中嵌入IKImageView是正确的做法.为了在调整窗口大小时让滚动条跟随窗口,您需要在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
Run Code Online (Sandbox Code Playgroud)

试试这个:

http://dl.dropbox.com/u/1583683/IKImageViewDemo.zip

它是IKImageViewDemo的一个版本,带有滚动条和上面的解决方法.