UIViewContentModeScaleAspectFill kırpılmıyor


144

Kullanarak sabit boyutta (100x100) bazı küçük resimler çizmeye çalışıyorum UIImageView. Ben 100x100 olmak benim görüntü görünümünün kare boyutunu ayarlayabilir ve kurdum contentModeiçin UIViewContentModeScaleAspectFill.

Anladığım kadarıyla bu, görüntünün benim belirlediğim boyutta çizilmesine neden olmalı ve görüntü görüntünün alanını dolduracak ve görüntünün resim görünümü için belirlediğim boyutun dışındaki herhangi bir bölümünü kırpacaktır. Ancak, resim yine de kendisi için belirlediğim 100x100 boyutundan daha büyük veya daha küçük çiziliyor.

Ben ayarlarsanız contentModeiçin UIviewContentModeScaleToFill, daha sonra görüntü tam olarak 100x100 olarak çizilir, ama bu boyutlara uyacak şekilde deforme oluyor. En boy dolgusunun neden beklendiği gibi kırpılmadığına dair bir fikriniz var mı?

İşte kodum:

_photoView = [[UIImageView alloc] initWithImage:photoImage];
_photoView.contentMode = UIViewContentModeScaleAspectFill;
[self addSubview:_photoView];

CGRect photoFrame = _photoView.frame;
photoFrame.size = CGSizeMake(100, 100);
_photoView.frame = photoFrame;

Daha iyi açıklamak için işte gördüklerimin bir ekran görüntüsü. Yeşil kareler vardır UIViewiçerikli UIImageViewben çalışıyorum. Arka plan rengini yeşile ve görünümün çerçevesini 100x100 olarak ayarladım. Test olarak, UIImageViews50x50 boyutundadır. Gördüğünüz gibi, kullanırken ...AspectFill, resimler 50x50 boyutunda değil ve bazı durumlarda istediğim yerden kaymış durumda. Kullanım sırasında ...ScaleToFilldoğru boyutlandırılırlar, ancak görüntü bozuktur.

Sorunu gösteren ekran görüntüsü

Yanıtlar:


352

Klibi sınırlara ayarlamayı deneyebilir misin

[_photoview setClipsToBounds:YES];

Veya yapabiliyorsanız doğrudan Storyboard / Xib'inizde:

görüntü açıklamasını buraya girin


10
İşte buydu - teşekkürler. (Gördüğümü daha iyi göstermek için yukarıdaki ekran görüntüsünü ekledim, daha çok bu sorunla karşılaşan başka biri olursa bir örnek olabilir.)
Josh Buhler

3
InterfaceBuilder'da (yardımcı olmadan) "Klip alt görünümleri" olarak yeniden adlandırıldı (NB: bu durumda, "alt görünümleri" kırpmıyor, ad yanlış: KENDİNİ VE alt görünümleri kırpıyor)
Adam

3
NIB dosyasında 'Klip Alt Görünümleri' seçeneğinin işaretlenmesi de aynı şeyi yapar. Şerefe.
codeburn

Peki ya CALayer özelliğini kullanarak bir gölge eklemek istiyorsanız :( arkasına başka bir görünüm eklemek benim için ideal değil
Rambatino

Benim gibi Otomatik Yerleşimi kullanıyorsanız, başka bir olası neden daha var, bu da NSLayoutConstraint "UIView-Encapsulated-Layout-Height" UIImageView boyut kısıtlamalarını bozuyor.
ewiinnnnn

8

Bilginizi genişletmek istiyorsanız, iOS UIView yığınının nasıl işlendiğine dair gerçekten iyi bir makale var . Tüm çizim boru hattı hakkında daha ayrıntılı bir makale de var .

Özetle:

  1. Rasterleştirme - Görünümün tüm içeriği, Görünümün sınırlarının koordinat alanında rasterleştirilir (çizilir veya ekran dışı piksel arabelleği). Bu, görüntü verileri veya özel çizim (yani drawRect:) olabilir, ancak alt görünüm içeriği olabilir. Bu rasterleştirme, contentModemülkü hesaba katar .

    Bir görünümün sınırları dışında kalan her şey atılır.

  2. Kompozisyon - Sonuçlar, alt görünümden süpervizöre kadar birleştirilir (üst üste çizilir). Bu, alt görünümün çerçeve özelliğini kullanır.

    Eğer clipsToBoundsözelliktir YESSuperview üzerinde o zaman kaybolacak Subview onun sınırların içeriği dışında.


2

aynı sorunu yaşadı ve "Klip Alt Görünümleri" işaretlenerek çözüldü.

Resim, film şeridi önizlemesinde tüm görünümler (3.5,4,4.7,5.5, ipad) için düzgün görünüyordu, ancak simülatörde gösterilmiyordu.

"Klip Alt Görünümleri" ni işaretledikten sonra sorun çözüldü. :)


1

Doğrudan Storyboard / Xib'de "Klip alt görünümlerini" kontrol etmek de benim için çalıştı. görüntü açıklamasını buraya girin


0

Alt görünümlerim yeniden boyutlandırılıyordu ve bunun xib'in otomatik düzen ayarlanmış olması nedeniyle olduğunu fark ettim: görüntü açıklamasını buraya girin


0

Her şey başarısız olursa

ViewDidLayoutSubviews Yönteminde klipleri sınırlara uygulayın.

Misal :

  override func viewDidLayoutSubviews() {

    imageProfile.layer.cornerRadius = imageProfile.bounds.size.width/2
    imageProfile.clipsToBounds = true
    imageProfile.layer.masksToBounds = true
 }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.