3

Apple が提供する IKImageViewDemo ( http://developer.apple.com/mac/library/samplecode/IKImageViewDemo/index.html ) を使用しようとしていますが、スクロールバーを追加しようとしています。私は2つのことを試しました:

1) 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);

ください:

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 スクローラー 0 ?

4

1 に答える 1

9

IKImageViewDemo で気になった点の 1 つは、イメージが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 のバージョンです。

于 2010-01-24T20:42:18.023 に答える