3 Stimmen

IKImageView und Bildlaufleisten

Ich versuche, das von Apple bereitgestellte IKImageViewDemo zu verwenden ( http://developer.apple.com/mac/library/samplecode/IKImageViewDemo/index.html ) und ich versuche, ihm Bildlaufleisten hinzuzufügen. Ich habe zwei Dinge versucht:

1) Einbettung der IKImageView in eine ScrollView. Dies hatte alle Arten von seltsamen Effekten, wie das Bild war nicht mehr dort, wo es sein sollte, und die Bildlaufleisten schien an einem festen Ort zu sein, egal wie groß das Fenster war (So konnte ich das Fenster schrumpfen und verlieren die Bildlaufleisten, obwohl die scrollview wurde eingestellt, um die Größe mit dem Fenster)

2) Ich fügte [_imageView setHasHorizontalScrollers: YES] (und vertikal) in den Code in der openImageURL-Methode. Dies scheint nichts bewirkt zu haben.

Übersehe ich etwas Offensichtliches?

Zusätzlich: Warum ist

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

Geben Sie mir:

scrollbar? H 0 V 0 hide 0
scrollbar? H 0 V 0 hide 0

?

Zusätzlich dazu:

Warum auch immer:

 BOOL b = _imageView.autohidesScrollers = YES;
 NSLog (@"b %d scrollers %d", b, _imageView.autohidesScrollers);

print b 1 scrollers 0 ?

9voto

Nicholas Riley Punkte 41936

Eine Sache, die Sie in IKImageViewDemo vielleicht gestört hat, war, dass das Bild gezoomt wurde, damit es in den Bereich windowDidResize: Methode ( [_imageView zoomImageToFit: self] ).

Das Einbetten der IKImageView in eine NSScrollView ist die richtige Vorgehensweise. Damit die Scrollbars dem Fenster bei der Größenänderung folgen, müssen Sie die Federn und Streben (== Autosizing-Maske) im Interface Builder anpassen.

Nachtrag: Wie Sie bemerkt haben, gibt es in Mac OS X 10.6 einen Fehler, der dazu führt, dass dies nicht richtig funktioniert. Sie können das Problem umgehen, indem Sie die NSScrollView wie folgt unterklassifizieren:

@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

Probieren Sie es aus:

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

Es handelt sich um eine Version von IKImageViewDemo mit Bildlaufleisten und der obigen Abhilfe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X