IKImageView和滚动条 [英] IKImageView and scroll bars
问题描述
我正在尝试使用apple提供的IKImageViewDemo( http ://developer.apple.com/mac/library/samplecode/IKImageViewDemo/index.html )我正在尝试向其中添加滚动条。我尝试了两件事:
I'm trying to use the IKImageViewDemo provided by apple (http://developer.apple.com/mac/library/samplecode/IKImageViewDemo/index.html) and I'm trying to add scrollbars to it. I've tried two things:
1)将IKImageView嵌入ScrollView中。这有各种奇怪的效果,比如图像不再位于应有的位置,并且滚动条似乎在一个固定的位置,无论窗口有多大(所以我可以缩小窗口并丢失滚动条,即使scrollview设置为使用窗口调整大小)
1) embedding the IKImageView in a ScrollView. This had all sorts of weird effects, like the image was no longer located where it should have been, and the scrollbars seemed to be in a fixed place, no matter how big the window was (So I could shrink the window and lose the scrollbars, even though the scrollview was set to resize with the window)
2)我将[_imageView setHasHorizontalScrollers:YES](和垂直)添加到openImageURL方法的代码中。这似乎什么也没做。
2) I added [_imageView setHasHorizontalScrollers: YES] (and vertical) into the code in the openImageURL method. This appears to have done nothing.
我错过了一些明显的东西吗?
Am I missing something obvious?
另外:为什么
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);
print b 1 scrollers 0?
print b 1 scrollers 0 ?
推荐答案
可能在IKImageViewDemo中引起注意的一件事是图像被缩放到适合 windowDidResize:
方法( [_ imageView zoomImageToFit:self]
)。
One thing that may have been catching you up in IKImageViewDemo was that the image was zoomed to fit in the windowDidResize:
method ([_imageView zoomImageToFit: self]
).
在NSScrollView中嵌入IKImageView是正确的做法。为了在调整窗口大小时让滚动条跟随窗口,您需要在Interface Builder中调整弹簧和支柱(==自动调整遮罩)。
Embedding the IKImageView in a NSScrollView is the right thing to do. In order to get the scrollbars to follow the window as you resize it, you need to adjust the springs and struts (== autoresizing mask) in Interface Builder.
附录:正如您所注意到的,Mac OS X 10.6中存在一个错误,导致无法正常工作。您可以通过子类化NSScrollView来解决此问题,如下所示:
Addendum: As you've noticed, there is a bug in Mac OS X 10.6 that causes this not to work properly. You can work around the problem by subclassing the NSScrollView as follows:
@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版本以及上述解决方法。
It's a version of IKImageViewDemo with scroll bars and the above workaround.
这篇关于IKImageView和滚动条的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!