IKImageView和滚动条

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

1)将IKImageView嵌入ScrollView中。这会产生各种奇怪的影响,例如图像不再位于应该在的位置,滚动条似乎处于固定位置,无论窗口大小如何(因此我可以缩小窗口并且失去滚动条,即使滚动视图已设置为随窗口调整大小)。

2)我在openImageURL方法中的代码中添加了[_imageView setHasHorizontalScrollers:YES](和vertical)。这似乎没有做任何事情。

我是否遗漏了一些显而易见的东西?

此外:为什么要使用


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?
1个回答

9

在 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版本。


谢谢!我已经禁用了窗口调整大小的功能...这个问题(我自己版本也遇到过)是当你把窗口缩小到图像在两个维度上都比窗口大时,滚动条就会消失。只要图像的边缘在窗口内(包括滚动条,如果有的话)的X或Y中,那么滚动条就会出现,但如果你缩小它,它们就会消失!对此有什么想法吗? - Brian Postow
这似乎是Mac OS X 10.6中IKImageView和自动隐藏滚动条的一个错误。在10.5中(我昨天编写和测试它的地方),当您将窗口缩小时,两个滚动条都会出现;但是一旦您超过滚动条的宽度(即使使用在10.5上构建的二进制文件),它们在10.6上都会消失。在10.6上,如果您设置_imageView.autohidesScrollers = NO;,我的代码确实可以工作。我会看看是否能找到解决方法。 - Nicholas Riley
太好了,谢谢!我不确定你是如何将IKImageView放入滚动视图的,但是当我复制了你的代码并稍微调整后,它就能正常工作了。谢谢!(现在我只需要想办法在调整大小时将图像锁定在顶部,而不是底部...可能只需要在调整大小时滚动一下就可以解决...) - Brian Postow
啊,对了。点击滚动视图,在检查器中点击(i)选项卡,然后在“类标识”下的类菜单中进行选择。 - Nicholas Riley
这在Mountain Lion中似乎有问题。我在这里打开了一个新的问题:http://stackoverflow.com/questions/12231573/two-finger-drag-with-ikimageview-and-nsscrollview-in-mountain-lion。如果有人对此问题有任何想法,我非常希望能得到你的反馈。 - Stateful
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接