2014-04-11 10 views
8

Also ich bin gewohnt, UIImageView, und in der Lage, verschiedene Möglichkeiten, wie sein Bild in ihm angezeigt wird. Wie zum Beispiel AspectFill-Modus etc ...NSImageView Bildaspekt ausfüllen?

Ich möchte das gleiche mit NSImageView auf einer Mac-App erreichen. Funktioniert NSImageView in dieser Hinsicht ähnlich wie UIImageView oder wie würde ich ein Bild in einem NSImageView anzeigen und verschiedene Möglichkeiten zur Anzeige dieses Bildes auswählen?

Antwort

11

Sie finden es möglicherweise viel einfacher, NSView zu unterklassifizieren und einen CALayer bereitzustellen, der den Aspekt für Sie füllt. Hier sehen Sie, wie die Init für diese NSView-Unterklasse aussehen könnte.

- (id)initWithFrame:(NSRect)frame andImage:(NSImage*)image 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
    self.layer = [[CALayer alloc] init]; 
    self.layer.contentsGravity = kCAGravityResizeAspectFill; 
    self.layer.contents = image; 
    self.wantsLayer = YES; 
    } 
    return self; 
} 

Beachten Sie, dass die Reihenfolge der Schicht der Einstellung, dann Einstellungen wantsLayer sehr wichtig ist (wenn Sie wantsLayer zuerst gesetzt, Sie eine Standard-Trägerschicht stattdessen bekommen).

Sie könnten eine setImage-Methode verwenden, die einfach den Inhalt des Layers aktualisiert.

+0

Laut doc https://developer.apple.com/documentation/appkit/nsimage ist es "Obwohl Sie ein NSImage-Objekt direkt der Inhaltseigenschaft eines CALayer-Objekts zuweisen können, führt dies möglicherweise nicht immer zu den besten Ergebnissen.Anstatt Ihr Bildobjekt zu verwenden, können Sie die Methode layerContents (forContentsScale :) verwenden, um ein Objekt zu erhalten, das Sie für den Inhalt Ihrer Ebene verwenden können. " – valR

12

Ich hatte das gleiche Problem. Ich wollte, dass das Bild so skaliert wird, dass es gefüllt wird, aber das Seitenverhältnis des Originalbildes beibehalten wird. Seltsamerweise ist dies nicht so einfach, wie es scheint, und kommt nicht mit NSImageView aus der Box. Ich wollte das NSImageView gut skalieren, während es mit Superview (s) skaliert. Ich habe eine Drop-in NSImageView Unterklasse Sie auf Github finden: KPCScaleToFillNSImageView

+0

Haben Sie herausfinden, warum das passiert ist? – jeswang

0

Für immer AspectFit Eigenschaft UIImageView in Cocoa NSImageView haben diese Methode

[imageView setImageScaling:NSScaleProportionally]; 

hier weitere Optionen ändern Bildanzeigeeigenschaft.

enum { 
    NSScaleProportionally = 0, // Deprecated. Use NSImageScaleProportionallyDown 
    NSScaleToFit,    // Deprecated. Use NSImageScaleAxesIndependently 
    NSScaleNone    // Deprecated. Use NSImageScaleNone 
}; 
+5

AspectFit ist nicht dasselbe wie AspectFill. – onekiloparsec

+0

NSImageScaleAxesIndependently dehnt das Bild aus, um den gesamten Rahmen von NSImageView zu füllen. Vielen Dank! – coolcool1994

0

Sie können diese verwenden: Bildkraft wird die Ansichtsgröße

(Aspect Fill)

imageView.imageScaling = .scaleAxesIndependently 


(Aspect Fit)

imageView.imageScaling = .scaleProportionallyUpOrDown 


(Zentrum zu füllen Oben)

imageView.imageScaling = .scaleProportionallyDown 

Es funktioniert für mich.

+6

Aus der Dokumentation: _Diese Einstellung behält nicht das Seitenverhältnis des Bildes. _ – DarkDust

+0

Arbeitete für mich. Vielen Dank! – Sean

1

Hier ist was ich benutze, geschrieben mit Swift. Dieser Ansatz funktioniert gut mit Storyboards - verwenden nur eine normale NSImageView, dann ersetzen Sie den Namen NSImageView in der Klasse Box, mit MyAspectFillImageNSImageView ...

open class MyAspectFillImageNSImageView : NSImageView { 

    open override var image: NSImage? { 
    set { 
     self.layer = CALayer() 
     self.layer?.contentsGravity = kCAGravityResizeAspectFill 
     self.layer?.contents = newValue 
     self.wantsLayer = true 

     super.image = newValue 
    } 

    get { 
     return super.image 
    } 
    } 
} 
+0

Dies schneidet das Bild nicht an die Grenzen der Bildansicht – p10ben

+0

Das stimmt - Es ist ein Aspekt füllen, kein Aspekt passt ... Pete – Pete

+0

Das ist super, danke Pete! Ich benutze nicht öffnen, einfach überschreiben var Bild [...] in der Unterklasse – MMV