Bu partiye biraz geç kaldım, ama eklemek için faydalı bir şeyim olduğunu düşünüyorum.
Kekoa'nın cevabı harika, ancak RonLugge'dan bahsettiği gibi, düğmenin artık saygı duymamasını sağlayabilir sizeToFit
veya daha da önemlisi, düğmenin kendiliğinden boyutlandırıldığında içeriğinin kırpılmasına neden olabilir. Olmadı!
İlk olarak,
Nasıl inandığımın kısa bir açıklaması imageEdgeInsets
ve titleEdgeInsets
çalıştığımın :
İçin dokümanlarimageEdgeInsets
kısmen söylemek gerekirse:
Düğme görüntüsü için etkili çizim dikdörtgenini yeniden boyutlandırmak ve yeniden konumlandırmak için bu özelliği kullanın. Dört iç metin (her biri için üst, sol, alt, sağ) için farklı bir değer belirleyebilirsiniz. Pozitif bir değer o kenarı küçültür veya ekler — düğmenin ortasına yaklaştırarak. Negatif bir değer bu kenarı genişletir veya öteler.
Bu belgenin, düğmenin başlığı olmadığını, sadece bir resmi olduğunu hayal ederek yazıldığına inanıyorum. Bu şekilde düşünmek çok daha mantıklı ve UIEdgeInsets
genellikle nasıl davranıyor . Temel olarak, görüntünün çerçevesi (veya başlığı ile titleEdgeInsets
) pozitif iç metinler için içe, negatif metinler için dışa doğru hareket ettirilir.
Tamam, ne olmuş yani?
Oraya geliyorum! Varsayılan olarak, bir görüntü ve bir başlık ayarlayarak aşağıdakilere sahip olursunuz (düğme kenarlığı sadece nerede olduğunu göstermek için yeşildir):
Bir görüntü ile bir başlık arasında boşluk olmasını istediğinizde, bunların herhangi birinin ezilmesine neden olmadan, görüntünün ve başlığın her birinde iki tane olmak üzere dört farklı ek ayarlamanız gerekir. Bunun nedeni , bu öğelerin çerçevelerinin boyutlarını değil, yalnızca konumlarını değiştirmek istemenizdir . Bu şekilde düşünmeye başladığınızda, Kekoa'nın mükemmel kategorisinde gereken değişiklik netleşir:
@implementation UIButton(ImageTitleCentering)
- (void)centerButtonAndImageWithSpacing:(CGFloat)spacing {
CGFloat insetAmount = spacing / 2.0;
self.imageEdgeInsets = UIEdgeInsetsMake(0, -insetAmount, 0, insetAmount);
self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
}
@end
Ama bekle , diyorsun ki, bunu yaptığımda şunu anlıyorum:
Ah evet! Unuttum, dokümanlar beni bu konuda uyardı. Kısmen diyorlar:
Bu özellik, yalnızca mizanpaj sırasında görüntüyü konumlandırmak için kullanılır. Düğmesine belirlemek için bu özelliği kullanmaz intrinsicContentSize
ve sizeThatFits:
.
Ama bir kutu yardımıyla bir özellik ve bu en contentEdgeInsets
. Bunun için dokümanlar kısmen:
Düğmesine belirlemek için bu özelliğini kullanır intrinsicContentSize
ve sizeThatFits:
.
Kulağa hoş geliyor. Kategoriyi bir kez daha değiştirelim:
@implementation UIButton(ImageTitleCentering)
- (void)centerButtonAndImageWithSpacing:(CGFloat)spacing {
CGFloat insetAmount = spacing / 2.0;
self.imageEdgeInsets = UIEdgeInsetsMake(0, -insetAmount, 0, insetAmount);
self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
self.contentEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, insetAmount);
}
@end
Ve ne elde edersiniz?
Bana bir kazanan gibi geliyor.
Swift'te çalışıyorsunuz ve hiç düşünmek istemiyor musunuz? Swift'teki uzantının son sürümü:
extension UIButton {
func centerTextAndImage(spacing: CGFloat) {
let insetAmount = spacing / 2
imageEdgeInsets = UIEdgeInsets(top: 0, left: -insetAmount, bottom: 0, right: insetAmount)
titleEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: -insetAmount)
contentEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: insetAmount)
}
}