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 UIImageView
yere contentMode
koyarak 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 imageView
mülkiyet UIButton
. Bunun UIButton
çalışması için özel tip ile oluşturulması gerekiyor (aksi takdirde nil
bu ö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.contentMode
Number
1
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.contentMode
benim 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 UIImageView
düğme arkasında yerleşik işlevselliği gevşek olacak UIButton
gibi sınıf adjustsImageWhenHighlighted
ve adjustsImageWhenDisabled
ve 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, UIImageView
s için işe yarar çünkü CALayer
iç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 UIImageView
ve başlık UILabel
. contentMode
Alt görünümleri ayarlamak istediğinizi yapabilir, ancak UIButton
görünüm hiyerarşisi ile uğraşmak biraz hayır-hayır.
Değişim UIButton.imageView.contentMode
benim 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,
contentMode
arasında UIImageView
düğ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 UIButton
alt 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 UIImageView
arkasına bir tane yerleştirdim ve bunun üzerinde istediğim seçenekleri belirledim, sonra sadece üzerine bir boşluk koydum UIButton
.