UIButton içerik modu ayarını dinlemiyor mu?


92

firstButton, Custom türünde bir UIButton'dur. Bunlardan üçünü programlı olarak bir tablonun her hücresine yerleştiriyorum, böylece:

[firstButton setImage:markImage forState:UIControlStateNormal];
[firstButton setContentMode:UIViewContentModeScaleAspectFit];
[cell.contentView addSubview:firstButton];

Başka bir yerde, clipToBounds'a söylüyorum. Elde ettiğim şey, görüntünün en-boy ölçekli bir görüntüsü yerine, görüntünün merkez karesinin bir kırpılması. FirstButton.imageView üzerinde mode özelliğini ayarlamak da dahil olmak üzere birçok yolu denedim, ki bu da işe yaramıyor gibi görünüyor.


1
Aşağıdaki Chris Nolet çözümüne bakın: button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
Matt

UIViewContentModeScaleAspectFit için hem contentVerticalAlignment hem de contentHorizontalAlignment ayarının gerekli olduğunu gösteren stackoverflow.com/a/28205566/481207 adresine bakın .
Matt

Yanıtlar:


187

Ben de aynı sorunu yaşadım. Bu sorunun biraz eski olduğunu görüyorum, ancak diğer insanları (benim gibi) arama sonuçlarında belirdiğinde bir süre kurtarmak için net ve doğru bir cevap vermek istiyorum.

Biraz araştırma ve deney yapmam gerekti, ancak çözümü buldum. Basitçe UIButton'un içindeki "gizli" ImageView'ün ContentMode'unu ayarlayın.

[[firstButton imageView] setContentMode: UIViewContentModeScaleAspectFit];
[firstButton setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];

Dan Ray'in kabul edilen cevabında kastettiği belki de buydu, ama sanmıyorum.


1
Hayır, değildi. Karar verdiğim çözüm, görüntüyü tutmak için bir UIImageView kullanmaktı, ardından üzerine "özel" türünde açık, şeffaf bir UIButton.
Dan Ray

Dave, en azından iOS 3.2'de çözümün benim için işe yaramıyor gibi görünüyor. Çok kötü, çünkü "ücretsiz" tıklamayla resmin vurgulanmasını umuyordum. ContentMode'u ayarladığım yerde button.imageView'ın sıfır olmadığından bile emin oldum ve aynen yaptığınız gibi contentMode'u ayarladıktan sonra görüntüyü ayarladım.
Jacques

2
Açıklığa kavuşturmak gerekirse, "çalışmıyor", "görüntünün tam çözünürlüğünde gösterilmesi, umduğum gibi küçültülmesi" anlamına gelir.
Jacques

Jacques, yukarıdaki benim için iOS 4.x'te çalışıyor. Ne yazık ki, bir v3.2 hedefiyle derleme yaparken "yeniden boyutlandırılmayacak" sorununu yeniden oluşturabilirim. UIButton görünümünün çerçeve boyutunu değiştirmeyi denedim, ancak bu da yardımcı olmadı. ugh.
Dave

4
Aşağıdaki Chris Nolet çözümüne bakın: button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
Matt

74

UIButton görüntüsüyle uğraşıyorsanız (backgroundImage'ın tersine), contentMode'u UIButton üzerinde veya imageView üzerinde ayarlamanın hiçbir etkisi yoktur (diğer yanıtların söylediğine rağmen).

Alternatif olarak bunu yapın:

self.button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
self.button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;

Veya resminizi buna göre boyutlandırın.

VEYA ona bir UITapGestureRecognizer eklenmiş bir UIImageView (contentMode'a uygun şekilde saygı duyar) veya üzerinde şeffaf bir UIButton kullanın.


4
Bu, iOS 7'deki durumum için işe yararken, buradaki diğerlerinin tümü işe yaramıyor.
Bayt

5
ContentHorizontalAlignment ve contentVerticalAlignment'ı ayarlamak doğru çözümdür. Açıklama için stackoverflow.com/a/28205566/481207 adresine bakın .
Matt

1
Bu aradığım cevap.
ninjaneer

4
Bu cevap yanlış. Sen do setine ihtiyaç contentModeüzerine imageViewEğer boy dolgunun veya uyum her türlü yapmak istiyorsanız diğer cevaplar açıklık gibi. Bakınız: stackoverflow.com/a/7944316/746890 .
Chris Nolet

52

contentModeDüğmenin kendisini ayarlamak yerine , her tür görünüm dolgusu veya sığdırmak için düğmenin ayarlarını contentHorizontalAlignmentve contentVerticalAlignmentözelliklerini ve (en önemlisi) contentModedüğmeyi ayarlamak isteyeceksiniz imageView. İşte bir örnek:

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
button.imageView.contentMode = UIViewContentModeScaleAspectFit;

Elbette, düğmenin resmini düğmenin üst kısmına hizalamak gibi başka şeyler de yapabilirsiniz. Bir en-boy dolgusuna veya sığdırmaya ihtiyacınız yoksa, hizalamayı kendiniz ayarlayabilirsiniz:

button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;

Swift'de şunları kullanmak isteyeceksiniz:

button.contentHorizontalAlignment = .fill
button.contentVerticalAlignment = .fill
button.imageView?.contentMode = .scaleAspectFit

Bu, otomatik yerleşimli en son sürümler de dahil olmak üzere tüm iOS sürümleri için çalışır (yani iOS 4 ila iOS 11+).


2
Teşekkürler Chris - bu benim sorunumu çözdü ya da daha doğrusu, görüntümü biraz üst sınırdan geri almak için contentEdgeInsets ile birlikte yaptı.
Rob Reuss

7

Birkaç saatlik kafa karışıklığından sonra, iOS 3.2 altında çalışmasını nasıl sağladığımı buradan öğrenebilirsiniz. Dusker'ın da belirttiği gibi, setImage yerine setBackgroundImage kullanmak benim için işi yaptı.

CGRect myButtonFrame = CGRectMake(0, 0, 250, 250);
UIImage *myButtonImage = [UIImage imageNamed:@"buttonImage"];

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];

[myButton setBackgroundImage:myButtonImage forState:UIControlStateNormal];
[myButton setFrame: myButtonFrame];
[myButton setContentMode: UIViewContentModeScaleAspectFit];

6

Cevap, istediğiniz tüm güzel İçerik Modu ayarlarına sahip bir UIImageView kullanmak ve ardından bunun üzerine özel bir düğme katmaktır. Hepsini tek seferde yapamayacağın aptalca, ama yapamayacaksın gibi görünüyor.


4

Bunun için bir düzeltme buldum. Set adjustsImageWhenHighlightedözelliği UIButtoniçin NO.

  UIButton *b = [[UIButton alloc] initWithFrame:rect];
        [b setImage:image forState:UIControlStateNormal];
        [b.imageView setContentMode:UIViewContentModeScaleAspectFill];
        [b setAdjustsImageWhenHighlighted:NO];

Bu yardımcı olur umarım. Aşağıda yorum yapmaktan çekinmeyin, sahip olduğunuz tüm soruları takip edeceğim.


Bu mükemmel çözüm.
Gaurav

Çalışmıyor. Bu yalnızca düğmenin vurgulanmasını önler.
Matt

4

Cevabım Kuba'nınkine benzer. Resmimin programlı olarak ayarlanmasına ihtiyacım vardı.

UIImage *image = [[UIImage alloc] initWithContentsOfFile:...];
[button setBackgroundImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill; //this is needed for some reason, won't work without it.
for(UIView *view in button.subviews) {
    view.contentMode = UIViewContentModeScaleAspectFill;
}

3

Benim için çalışan tek çözüm:

[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;


1

SetImage yerine setBackgroundImage'ı deneyin


3
Hmp. A, bu aptalca, İÇERİĞİ için İÇERİK MODU ayarına saygı göstermeli, değil mi? Ve B, HALA mod ayarına saygı göstermiyor gibi görünüyor - artık "esnetmek" için kilitlendi (bu, bu durumda daha çok "sıkıştırmak" gibi) ve içeriği kendi yönüne göre ölçeklendirmiyor oran.
Dan Ray

1

Burada basit bir arayüz oluşturucu sorunumuz olduğuna inanıyorum - görünüşe göre IB, görüntü özelliğini ayarladıktan SONRA içerik modu değişikliklerini görmezden geliyor.

çözüm bu kadar basit: içerik modunu ayarlayın, önceden ayarlanmış resim adlarını kaldırın (tüm durumlarda, varsayılan, vurgulanmış vb. kaldırdığınızdan emin olun), ardından istenen tüm durumlarda istenen resim adlarını yeniden girin - et voilà .


1
aynı şey programlı olarak ayarlanan içerik modu için de geçerlidir - görüntüyü içerik modunu ayarlamadan ÖNCE ayarlamayın
JohnPayne

0

Ayrıca bir göz atmanızı tavsiye ederim. adjustsImageWhenHighlighted UIButton , düğmeye basıldığında görüntünün tuhaf deformasyonlarından kaçınmak mülke .


0

Bunu anlamaya çalışırken, yöntemim zaman geçtikçe biraz daha hacklendi ve UIButton'u alt sınıflara ayırıp setHighlighted'ı geçersiz kılma:

Benim için bu, görüntü alfa değerini 0,5'e düşürmek için çalışıyor, çünkü onlar siyah bir arka planda.

Ancak, yalnızca [super setHighlighted:] (burada göründüğü yerde resim esnek kod devam ediyor) yorum yaparsam işe yarıyor, bu da bunu çözmenin doğru yolu gibi görünmüyor ... her şey öyle görünüyor yine de iyi çalışıyor. Ben üzerinde çalışmaya devam ederken nasıl dayandığını göreceğiz.

- (void)setHighlighted:(BOOL)highlight {
    if (highlight) {
        [self.imageView setAlpha:.5];
    }  else {
        [self.imageView setAlpha:1];        
    }

//    [super setHighlighted:highlight];
}

1
Şans eseri, herhangi birinin bunu alakalı bulması durumunda, yukarıdaki yöntemim, düğmeleri bir UIScrollView'a yerleştirene kadar iyi çalışıyor gibiydi, burada bazen düğmenin vurgusu "sıkışmış" oluyordu, ki bu da sonunda olabileceğinden şüpheleniyordum.
jankins

0

İOS 6, iOS 7 ve storyboard'da işe yarayan bir cevap arayanlar varsa:

Film şeridinizde görüntüyü ayarlayabilirsiniz:

görüntü açıklamasını buraya girin

Ve sonra:

for(UIView* testId in self.subviews) {
    if([testId isKindOfClass:[UIImageView class]])
        [testId setContentMode:UIViewContentModeScaleAspectFill];
}

0

UIB düğmesi düzen kısıtlama ayarlarını dinlemiyor gibi görünüyorsa, görüntülerin düğme boyutundan daha büyük olup olmadığını kontrol edin. Retina çözünürlükleri için her zaman @ 2x ve @ 3x görüntüleri kullanın.


0

Bu iki şey (başlangıçta bulunması oldukça zordur) UIButton resminizi düğme boyutuna sığacak şekilde uzatacaktır:

görüntü açıklamasını buraya girin görüntü açıklamasını buraya girin

her zaman böyle bir şeyi Storyboard'da kod yerine ayarlamaya çalışmalısınız.

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.