UIButton, iPhone'da Aspect Fit'e gitmiyor


105

Birkaç UIButton'um var ve IB'de Aspect Fit'e ayarlılar, ancak bazı nedenlerden dolayı her zaman esniyorlar. Ayarlamanız gereken başka bir şey var mı? Tüm farklı görünüm modlarını denedim ve hiçbiri çalışmıyor, hepsi geniş.


@Werner Altesischer'in cevabı doğru olanıdır. Uygun değişiklikleri yapın.
Harshit Gupta

1
@marty Arka plan resmini veya resmini mi ayarlıyorsunuz? arka plan resmi desteklemiyor, sadece resim.
Juan Boero

Yanıtlar:


45

Bu sorunu daha önce yaşadım. Bunu, resmimi ayarların gerçekten çalıştığı bir UIImageViewyere contentModekoyarak ve bunun üzerine şeffaf bir gelenek koyarak çözdüm UIButton.

DÜZENLEME: Bu cevap eski. İOS'un modern sürümlerinde doğru yanıt için @ Werner Altewischer'in cevabına bakın .


Evet bunu denedim, ancak şimdi görüntüye yeniden yerleştirmek için düğmeyi alamıyorum
Marty

Bu teknikle düğme durumlarını nasıl yönetirsiniz? Kullanıcı etkileşimine "vurgulanmış" gibi yanıt vermek bir kabus gibi görünüyor.
SooDesuNe

3
Bu, 2,5 yıl önce bu soru yanıtlandığında bunu yapmanın doğru yolu olabilirdi, ancak şimdi UIButton'ın dahili ImageView'unu düzenleyebilir ve oradaki içerik modunu ayarlayabilirsiniz. Cevabı @Werner Altewischer tarafından görün
Steve Haley

233

Solüsyon ayarlamaktır contentModeüzerinde imageViewmülkiyet UIButton. Bunun UIButtonçalışması için özel tip ile oluşturulması gerekiyor (aksi takdirde nilbu özellik için iade edilir).


67
Bu benim için çalıştı:[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
ayreguitar

2
Bu benim için de işe yarıyor, ancak ayarlarImageWhenHighlighted = YES olarak ayarlarsam, düğmeye dokunduğumda görüntü yeniden uzatılıyor.
cduck

1
AdjustsImage'daki esneme işlemi iOS 6'da ortadan kaldırıldı.
Ben Flynn 13

3
İOS 8'de bu aslında benim için çalışmıyor. Orijinal cevap (şeffaf bir düğmenin arkasına bir imageView yerleştirerek) en iyi sonucu verir.
user1416564

3
Swift du jour'da:button.imageView!.contentMode = UIViewContentMode.scaleAspectFit
Nestor

57

Bu yöntem benim için çok iyi çalıştı .:

In XIb'nin düğmesini ve set user defined runtime attributes:

  • Anahtar yol: self.imageView.contentMode
  • Tür: Number
  • Değer: 1

Çözümü daha net görmek için burayı tıklayın

Numarayı kullanıyoruz çünkü orada enum kullanamazsınız. Ancak UIViewContentModeScaleAspectFit, 1'e eşittir.


2
Bu, tasarım sırasında arayüz oluşturucudaki görüntüyü de güncelledi. Harika çözüm.
George Filippakos

Harika bir çözüm, az sayıda kod ve bir cazibe gibi çalışır, enum içerik modu liste öğelerini temel alır.
Kross

Biraz daha kolay hale getirmek için bir uzantı da ekleyebilirsiniz: extension UIButton { @IBInspectable var imageContentMode: Int { get {return imageView?.contentMode.rawValue ?? 0} set {imageView?.contentMode = UIViewContentMode(rawValue: newValue) ?? .scaleAspectFit} } }
Yonat

'Öz' olmadan imageView.contentModebenim için çalıştı!
byJeevan

22

Bunu Arayüz Oluşturucu'da yapıyorsanız, bunu herhangi bir kod olmadan doğrudan ayarlamak için Çalışma Zamanı öznitelikleri denetçisini kullanabilirsiniz.

Düğmedeki Anahtar Yolunuzu, bir "Sayı" türü ve "1" değeri (veya istediğiniz mod) ile "imageView.contentMode" olacak şekilde ayarlayın.

imageview.contentMode = 1


14

ContentMode için düğmenin imageView özelliğini kullanın. Doğrudan düğmenin üzerinde değil.

homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];

6

Bir görüntüyü koyarsanız UIImageViewdüğme arkasında yerleşik işlevselliği gevşek olacak UIButtongibi sınıf adjustsImageWhenHighlightedve adjustsImageWhenDisabledve farklı devletler için farklı resimler ayarlamak için ders yeteneği (bu kendiniz yaparak hazzle olmadan).

Tüm kontrol durumları için gerilmemiş bir görüntünün olmasını istiyorsak imageWithCGImage:scale:orientation, aşağıdaki yöntemde olduğu gibi görüntüyü kullanarak bir uygulama elde etmektir :

- (UIImage *) getScaledImage:(UIImage *)img insideButton:(UIButton *)btn {

    // Check which dimension (width or height) to pay respect to and
    // calculate the scale factor
    CGFloat imgRatio = img.size.width / img.size.height, 
            btnRatio = btn.frame.size.width / btn.frame.size.height,
            scaleFactor = (imgRatio > btnRatio 
                           ? img.size.width / btn.frame.size.width
                           : img.size.height / btn.frame.size.height;

    // Create image using scale factor
    UIImage *scaledImg = [UIImage imageWithCGImage:[img CGImage]
                                             scale:scaleFactor
                                       orientation:UIImageOrientationUp];
    return scaledImg;
}

Bunu uygulamak için şunu yazacağız:

UIImage *scaledImg = [self getScaledImage:myBtnImg insideButton:myBtn];
[myBtn setImage:scaledImg forState:UIControlStateNormal];

Bu, görüntünün tüm kontrol durumlarında uzamasını önlemelidir. Benim için çalıştı, ancak işe yaramazsa bana bildirin!

NOT: Burada UIButton, ancak insideButton:iyi olabileceği insideView:veya birinin görüntünün içine sığdırmak istediği şeyle ilgili bir sorunu ele alıyoruz .


6

Bu problemi bir süre önce yaşadım. Karşılaştığım sorun, bu efekti sınırlı olan arka plan UIButtonuna uygulamaya çalışmamdı ve bu nedenle onu kolay ayarlayamayacağınız anlamına geliyordu.

İşin püf noktası, onu sadece bir görüntü olarak ayarlamak ve ardından @ ayreguitar'ın tekniğini uygulamak ve bu onu düzeltmeli!

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];

4

Bu benim için çalıştı

[button.imageView setContentMode:UIViewContentModeScaleAspectFit];

@Ayreguitar'a yorumu için teşekkürler


4

İşte hızlı bir alternatif cevap:

myButton.imageView?.contentMode = .ScaleAspectFit

4

Birkaç farklı yanıtı tek bir çözümde bir araya getirerek - özel tipte bir düğme oluşturun, düğmenin imageView contentMode özelliğini ayarlayın ve düğme için görüntüyü ayarlayın (yine de doldurmak için ölçeklenecek olan arka plan görüntüsü değil).

//Objective-C:
UIImage *image = [UIImage imageNamed:"myImageName.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFit;

//Swift:
let image = UIImage(named: "myImageName.png")
let button = UIButton(type: .custom)
button.imageView?.contentMode = .scaleAspectFit
button.setImage(image, for: .normal)

3
btn.imageView.contentMode = UIViewContentModeScaleAspectFit;

Bu kod parçacığı soruyu çözebilirken, bir açıklama eklemek, yayınınızın kalitesini artırmaya gerçekten yardımcı olur. Gelecekte okuyucular için soruyu yanıtladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceklerini unutmayın. - İncelemeden
Ferrybig

2

Bu cevap @ WernerAltewischer'in cevabına dayanmaktadır .

Düğmemi üzerindeki kodu çalıştırmak için bir IBOutlet'e bağlamayı önlemek için, UIButton'ın sınıfını alt sınıflara ayırdım:

// .h
@interface UIButtonWithImageAspectFit : UIButton
@end

// .m
@implementation UIButtonWithImageAspectFit

- (void) awakeFromNib {
    [self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}

@end



Şimdi xib'inizde özel bir düğme oluşturun ve görüntüsünü ayarlayın (arka plan görüntüsü değil):

UIButtonWithImageAspectFit: görüntü oluşturma ve ayarlama


Ardından, sınıfını ayarlayın:

UIButtonWithImageAspectFit: özel sınıf ayarla

Sen bittin!
Düğmenizin
Görüntünün en boyuna sığdırılmayan UIB düğmesi
görüntüsü yerine en boy oranı artık beklendiği gibi:
Görüntünün en boy oranına sığdırılmış UIB düğmesi


2

ios 12. İçerik Hizalamasını da eklemeniz gerekir

class FitButton: UIButton {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)


    }

    override func layoutSubviews() {
        self.imageView?.contentMode = .scaleAspectFill
        self.contentHorizontalAlignment = .fill
        self.contentVerticalAlignment = .fill
        super.layoutSubviews()


    }

}

1

Resmin orantılı olarak yeniden boyutlandırılamamasıyla ilgili sorunlar yaşadım, bu yüzden onu düzeltme şeklim kenar girintileri kullanmaktı.

fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);

1

UIView içerik modları, ilgili CALayer'ın "içeriğine" uygulanır. Bu, UIImageViews için işe yarar çünkü CALayeriçeriği karşılık gelen olarak ayarlarlar CGImage.

drawRect: sonuçta katman içeriğine dönüşür.

Bir özel UIButton(bildiğim kadarıyla) içerik içermiyor (yuvarlatılmış dikdörtgen stil düğmeleri içerik kullanılarak oluşturulabilir). Düğmenin alt görünümleri vardır: arka plan UIImageView, resim UIImageViewve başlık UILabel. contentModeAlt görünümleri ayarlamak istediğinizi yapabilir, ancak UIButtongörünüm hiyerarşisi ile uğraşmak biraz hayır-hayır.


1

Değişim UIButton.imageView.contentModebenim için işe yaramadı.
Görüntüyü 'Arka Plan' özelliğine ayarlayarak sorunu çözdüm.
İhtiyaç duyarsanız oran kısıtlaması ekleyebilirsiniz


1

Bu, diğer cevapların çoğuyla örtüşüyor, ancak benim için çözüm,

  • set contentModearasında UIImageViewdüğmeye için .ScaleAspectFit- ya Interface Builder içinde “Runtime Kullanıcı Tanımlı Özellikler” yapılabilir (. yani self.imageView.contentMode, Sayı, 1) veya bir yer UIButtonalt sınıf;
  • "Alt Görünümleri Otomatik Yeniden Boyutlandır" ı devre dışı bırakın;
  • "Kenar" ı "Görüntü" olarak ve "İç Gömme" için uygun "Üst" ve "Alt" değerlerini ayarlayın (bu, yalnızca benim gibi, görüntü olarak bir PDF kullandıysanız gerekli olabilir).

0

İmageWithCGImage'ı yukarıda gösterildiği gibi kullanabilirsiniz (ancak eksik parantezler olmadan).

Ayrıca ... 4.0 olmayan milyonlarca telefon bu kodla hiç çalışmayacaktır.


0

[button sizeToFit] benim için çalıştı.


0

@ Guillaume'a benzer şekilde, Swift-Dosyası olarak bir UIButton alt sınıfı oluşturdum. Ardından, Arayüz Oluşturucu'da özel sınıfımı ayarlayın:

arayüz oluşturucu.

Ve işte Swift dosyası:

import UIKit

class TRAspectButton : UIButton {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.imageView?.contentMode = .ScaleAspectFit
    }
}

-1

Aynı sorunu yaşadım, ancak çalışmasını sağlayamadım (belki de SDK ile ilgili bir hata olabilir).

Sonunda, geçici bir çözüm olarak, düğmemin UIImageViewarkasına bir tane yerleştirdim ve bunun üzerinde istediğim seçenekleri belirledim, sonra sadece üzerine bir boşluk koydum UIButton.


7
Burada bir yankı var mı? ;-)
Dan Ray
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.