2014-04-11 16 views
8

UIImageView için kullanıyorum ve görüntünün nasıl görüntülendiğini farklı şekillerde ayarlayabiliyorum. Örneğin AspectFill modu gibi ...NSImageView görüntü en boy oranı?

Aynı şeyi bir mac uygulamasında NSImageView kullanarak da yapmak isterim. NSImageView, bu bağlamda UIImageView ile benzer şekilde çalışıyor mu, yoksa bir NSImageView görüntüsünde resim göstermeye ve bu görüntüyü farklı biçimlerde seçmeye nasıl giderim?

cevap

11

NSView alt sınıfını bulmak ve görünümün sizin için doldurduğu bir CALayer sağlamak çok daha kolay olabilir. İşte bu NSView alt sınıfı için init nasıl görünebilir. katmanı ayar sırası, daha sonra (önce wantsLayer ayarlarsanız, bunun yerine varsayılan bir destek tabakası elde edersiniz) wantsLayer çok önemli ayarları o

- (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; 
} 

Not.

Katmanın içeriğini basitçe güncelleyen setImage yönteminiz olabilir.

+0

https://developer.apple.com/documentation/appkit/nsimage belgesine göre, "Bir NSImage nesnesini doğrudan CALayer nesnesinin content özelliğine atayabilseniz de, bunu yapmak her zaman en iyi sonuçları vermeyebilir.Görüntü nesnesini kullanmak yerine, katman içeriğiniz için kullanabileceğiniz bir nesneyi elde etmek için layerContents (forContentsScale :) yöntemini kullanabilirsiniz. " – valR

12

Aynı problem vardı. Resmi, orijinal görüntünün en boy oranını korumak için ölçeklenecek şekilde büyütmek istedim. Gariptir, bu göründüğü kadar basit değildir ve NSImageView ile kutudan çıkmaz. Superview (s) ile yeniden boyutlandırırken NSImageView ölçeğini güzelce istedim. Bu yöntemi

[imageView setImageScaling:NSScaleProportionally]; 

Burada görüntü ekran özelliğini değiştirmek için daha fazla seçenek vardır var Kakao NSImageView içinde UIImageView arasında AspectFit özelliğini alma için KPCScaleToFillNSImageView

+0

neden bu oldu anlamaya mı, o zaman ... MyAspectFillImageNSImageView ile, Sınıf kutusuna adı NSImageView yerine normal bir NSImageView kullanılır? – jeswang

0

: Bir damla-in NSImageView alt sınıf github üzerinde bulabilirsiniz yaptı.

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

AspectFit, AspectFill ile aynı değil. – onekiloparsec

+0

NSImageScaleAxesSürekli olarak NSImageView çerçevesinin tamamını doldurmak için resmi uzatır. Teşekkürler! – coolcool1994

0

Bu kullanabilirsiniz: Görüntü görünüm boyutunu

(Aspect Dolgu)

imageView.imageScaling = .scaleAxesIndependently 


(Aspect Fit)

imageView.imageScaling = .scaleProportionallyUpOrDown 


(Merkezini doldurmak için güç olacak Üst)

imageView.imageScaling = .scaleProportionallyDown 

Benim için çalışıyor.

+6

Dokümantasyondan: _Bu ayar, görüntünün en boy oranını korumaz. – DarkDust

+0

Benim için çalıştı. Teşekkürler! – Sean

1

Kullanmakta olduğum şey Swift ile yazılmış. Bu yaklaşım storyboard'una iyi çalışıyor - sadece

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

görüntüyü görüntü görünümünün sınırlarına sığmıyor – p10ben

+0

Doğru - Bu bir görünüm doldurma, bir uygunluk değil ... Pete – Pete

+0

Bu harika, teşekkürler Pete! Ben açık kullanmayın, sadece alt sınıfta geçersiz kıl var resmi ekle [...] – MMV