SORU
30 Aralık 2010, PERŞEMBE


İmageEdgeİnsets ile UİButton metin ve görüntü hizalama ve titleEdgeİnsets

Bir simge, metin, görüntü ve metin başlangıcı arasında boşluk yaklaşık 2-3 piksel var böyle iki satırlık sol yerleştirmek istiyorum. Yatay (Interface Builder ile set) uyumlu kendisidir Merkezi kontrol

Düğme bunun gibi bir şeye benzer:

|                  |
|[Image] Add To    |
|        Favorites |

ContentEdgeİnset, imageEdgeİnsets ve boşuna titleEdgeİnsets ile bu yapılandırmak için çalışıyorum. Negatif bir değer pozitif bir değer bunu merkezine daha yakın taşımak için küçülür ise kenarı genişletir anlıyorum.

Denedim:

[button setTitleEdgeInsets:UIEdgeInsetsMake(0, -image.size.width, 0, 0)];
[button setImageEdgeInsets:UIEdgeInsetsMake(0, button.titleLabel.bounds.size.width, 0, 0)];

ama bu doğru görüntülemiyor. Değerleri verdiği ama değer beklenen şekilde hareket görünmüyor sol İç metin üzerinde -10 -5 diyelim geçiriyorum. -10 metin -5 sol taraftan yarım kaçmak için bekliyordum ama yok o kadar sola kay.

Parçalar arkasındaki mantık nedir? Görüntü yerleşimleri ve terminoloji aşina değilim.

Referans olarak bu KADAR soru kullandım ama benim değerler hakkında bir şey doğru değil. UIButton: how to center an image and a text using imageEdgeInsets and titleEdgeInsets?

CEVAP
29 AĞUSTOS 2014, Cuma


Bu partiye biraz geç kaldım, ama bir şey eklemek için yararlı olduğunu düşünüyorum.

Kekoa cevabı büyük ama, RonLugge bahseder, bunu yapabilirsiniz düğmesi artık saygı sizeToFit ya da, daha önemlisi, neden düğmeye klip içeriği zaman özünde bulunur. Eyvah!

Gerçi, ilk

imageEdgeInsets titleEdgeInsets çalışır inanıyorum nasıl kısa bir açıklama:

docs for imageEdgeInsets söylemek şu bölüm var:

Bu özellik ve düğme resmi için etkili çizim dikdörtgeni yeniden boyutlandırmak yeniden konumlandırmak için kullanın. Dört parçalar (üst, sol, alt, sağ her biri için farklı bir değer belirtebilirsiniz. Pozitif bir değer kenar—hareket düğmesi merkezine daha yakın olan, ya parçalar, küçültür. Negatif bir değer genişletir, ya da, kenar outsets.

Bu belge düğmesini Başlığı hayal, sadece bir görüntü yazılı olduğuna inanıyorum. Çok daha mantıklı bu şekilde düşünmemiştim yapar, ve UIEdgeInsets genellikle nasıl davranır. Temel olarak, resmin çerçevesi (veya unvanı, titleEdgeInsets) içe olumlu parçalar için taşınır ve negatif parçalar için dışa doğru.

TAMAM, ne olmuş yani?

Ben de oraya geliyorum! Varsayılan olarak ne var işte, bir resim ve bir başlık (düğme sınırının nerede olduğunu göstermek için yeşil yanar) ayarı:

Starting image; no space between title and image.

Bir resim ve bir başlık arasındaki boşluk istediğinizde, ya da ezilmeye neden olmadan, dört farklı parçalar, görüntü ve başlık her iki ayarlamanız gerekir. Bunu değiştirmek istemiyorum çünküboyutlarıbu elemanların Kare, ama sadece kendi pozisyonları. Bu şekilde düşünmeye başlayınca, Kekoa mükemmel bir kategori için gerekli değişime açık hale gelir:

@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 beklediyorsun., ^em>bunu yaptığımda bu çıkıyor:

Spacing is good, but the image and title are outside the view's frame.

Oh evet! , the docs beni bu konuda uyarmıştı unuttum. Derler ki, bir bölümü

Bu mülkiyet düzeni sırasında görüntü konumlandırma için kullanılır. Düğmesi intrinsicContentSize sizeThatFits: belirlemek için bu özelliği kullanın.

Ama yokbir özelliği yardımcı olabilir, ve o contentEdgeInsets. The docs Bu çok açık, bir bölümü

Düğmesi intrinsicContentSize sizeThatFits: belirlemek için bu özelliği kullanır.

Kulağa hoş geliyor. İzin çimdik bir kez daha kategori:

@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 ediyorsun?

Spacing and frame are now correct.

Benim için bir kazanan gibi görünüyor.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EmperorTigerstar

    EmperorTiger

    14 EYLÜL 2009
  • Matt Stokes

    Matt Stokes

    22 Ocak 2008
  • Top10Series

    Top10Series

    26 Kasım 2008