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ş.
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ş.
Yanıtlar:
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 .
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).
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
button.imageView!.contentMode = UIViewContentMode.scaleAspectFit
Bu yöntem benim için çok iyi çalıştı .:
In XIb'nin düğmesini ve set user defined runtime attributes:
self.imageView.contentModeNumber1
Numarayı kullanıyoruz çünkü orada enum kullanamazsınız. Ancak UIViewContentModeScaleAspectFit, 1'e eşittir.
extension UIButton { @IBInspectable var imageContentMode: Int { get {return imageView?.contentMode.rawValue ?? 0} set {imageView?.contentMode = UIViewContentMode(rawValue: newValue) ?? .scaleAspectFit} } }
imageView.contentModebenim için çalıştı!
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.
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];
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 .
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];
Bu benim için çalıştı
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
@Ayreguitar'a yorumu için teşekkürler
İşte hızlı bir alternatif cevap:
myButton.imageView?.contentMode = .ScaleAspectFit
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)
btn.imageView.contentMode = UIViewContentModeScaleAspectFit;
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):

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

Sen bittin!
Düğmenizin

görüntüsü yerine en boy oranı artık beklendiği gibi:

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()
}
}
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.
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
Bu, diğer cevapların çoğuyla örtüşüyor, ancak benim için çözüm,
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;@ 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:
Ve işte Swift dosyası:
import UIKit
class TRAspectButton : UIButton {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.imageView?.contentMode = .ScaleAspectFit
}
}
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.