firstButton to UIButton typu Custom. Programowo umieszczam trzy z nich w każdej komórce tabeli, w ten sposób:
[firstButton setImage:markImage forState:UIControlStateNormal];
[firstButton setContentMode:UIViewContentModeScaleAspectFit];
[cell.contentView addSubview:firstButton];
W innym miejscu mówię mu, aby clipToBounds. To, co otrzymuję, to przycięcie środkowego kwadratu obrazu, a nie jego renderowanie ze skalą proporcji. Próbowałem tego na wiele sposobów, w tym ustawienie właściwości trybu na firstButton.imageView, co również wydaje się nie działać.
ios
uibutton
contentmode
Dan Ray
źródło
źródło
Odpowiedzi:
Miałem ten sam problem. Widzę, że to pytanie jest trochę stare, ale chcę udzielić jasnej i poprawnej odpowiedzi, aby zaoszczędzić innym ludziom (takim jak ja) trochę czasu, gdy pojawi się w ich wynikach wyszukiwania.
Zajęło mi to trochę poszukiwań i eksperymentów, ale znalazłem rozwiązanie. Wystarczy ustawić ContentMode „ukrytego” ImageView, który znajduje się wewnątrz UIButton.
[[firstButton imageView] setContentMode: UIViewContentModeScaleAspectFit]; [firstButton setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
Być może do tego nawiązywał Dan Ray w swojej zaakceptowanej odpowiedzi, ale podejrzewam, że nie.
źródło
Jeśli masz do czynienia z obrazem UIButton (w przeciwieństwie do jego backgroundImage), ustawienie contentMode na samym UIButton lub na jego imageView nie ma wpływu (pomimo tego, co mówią inne odpowiedzi).
Alternatywnie zrób to zamiast tego:
self.button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; self.button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
Lub odpowiednio dopasuj rozmiar obrazu.
LUB po prostu użyj UIImageView (który odpowiednio szanuje contentMode) z dołączonym do niego UITapGestureRecognizer lub przezroczystym UIButton na wierzchu.
źródło
contentMode
w sprawieimageView
, jeśli chcesz zrobić każdy rodzaj wypełnienia kształtu lub dopasowania, jak inne odpowiedzi zostały wyjaśnione. Zobacz: stackoverflow.com/a/7944316/746890 .Zamiast ustawiać przycisk
contentMode
na samym przycisku, będziesz chciał ustawićcontentHorizontalAlignment
icontentVerticalAlignment
właściwości oraz (co najważniejsze)contentMode
dla przyciskuimageView
dla dowolnego rodzaju wypełnienia lub dopasowania. Oto przykład:button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill; button.imageView.contentMode = UIViewContentModeScaleAspectFit;
Oczywiście możesz także wykonać inne czynności, takie jak wyrównanie obrazu przycisku do górnej części przycisku. Jeśli nie potrzebujesz wypełnienia lub dopasowania aspektu, możesz po prostu ustawić wyrównanie samodzielnie:
button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
W Swift będziesz chciał użyć:
Działa to dla wszystkich wersji iOS, w tym najnowszych wersji z automatycznym układem (tj. IOS 4 do iOS 11+).
źródło
Po kilku godzinach zamieszania, oto jak sprawiłem, że zadziała pod iOS 3.2. Jak wspomniał Dusker, użycie setBackgroundImage zamiast setImage wykonało pracę za mnie.
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];
źródło
Odpowiedź brzmi: użyj UIImageView ze wszystkimi pięknymi ustawieniami trybu treści, które chcesz, a następnie umieść na nim niestandardowy przycisk. Głupi, że nie możesz tego zrobić za jednym zamachem, ale wydaje się, że nie możesz.
źródło
Znalazłem rozwiązanie tego problemu. Ustaw
adjustsImageWhenHighlighted
właściwośćUIButton
toNO
.UIButton *b = [[UIButton alloc] initWithFrame:rect]; [b setImage:image forState:UIControlStateNormal]; [b.imageView setContentMode:UIViewContentModeScaleAspectFill]; [b setAdjustsImageWhenHighlighted:NO];
Mam nadzieję że to pomoże. Zapraszam do komentowania poniżej, odpowiem na wszelkie pytania, które masz.
źródło
Moja odpowiedź jest podobna do tej Kuby. Potrzebowałem programowego ustawienia obrazu.
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; }
źródło
Jedyne rozwiązanie, które u mnie zadziałało:
[button setImage:image forState:UIControlStateNormal]; button.imageView.contentMode = UIViewContentModeScaleAspectFill; button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
źródło
Szybki 3
self.firstButton.imageView?.contentMode = .scaleAspectFill
źródło
Zamiast setImage spróbuj setBackgroundImage
źródło
Uważam, że mamy tutaj prosty problem z konstruktorem interfejsu - najwyraźniej IB ignoruje wszelkie zmiany trybu treści PO ustawieniu właściwości obrazu.
rozwiązanie jest tak proste: ustaw tryb treści, usuń wcześniej ustawione nazwy obrazów (upewnij się, że usunąłeś je we wszystkich stanach, domyślnych, podświetlonych itp.), a następnie ponownie wprowadź żądane nazwy obrazów we wszystkich pożądanych stanach - et voilà .
źródło
Radzę też przyjrzeć się tej
adjustsImageWhenHighlighted
UIButton
nieruchomości, aby uniknąć dziwnych deformacji obrazu, gdy przycisk jest wciśnięty.źródło
Próbując to rozgryźć, moja metoda stawała się nieco trudniejsza w miarę upływu czasu i zakończyłem podklasę UIButton i nadpisanie setHighlighted:
U mnie działa po prostu obniżyć alfa obrazu do 0,5, ponieważ są na czarnym tle.
Jednak działa to tylko wtedy, gdy skomentuję [super setHighlighted:] (gdzie wygląda na to, że kod jest rozciągliwy na obrazie), co po prostu nie wydaje się być właściwym sposobem rozwiązania tego problemu ... wszystko wydaje się być działa dobrze, chociaż. Zobaczymy, jak to wytrzyma, gdy będę nad nim pracował.
- (void)setHighlighted:(BOOL)highlight { if (highlight) { [self.imageView setAlpha:.5]; } else { [self.imageView setAlpha:1]; } // [super setHighlighted:highlight]; }
źródło
Jeśli ktoś szuka odpowiedzi, która działa w iOS 6 i iOS 7 oraz w scenorysie:
Możesz ustawić obraz w swojej serii ujęć:
I wtedy:
for(UIView* testId in self.subviews) { if([testId isKindOfClass:[UIImageView class]]) [testId setContentMode:UIViewContentModeScaleAspectFill]; }
źródło
Jeśli wydaje się, że przycisk UIButton nie nasłuchuje ustawień ograniczeń układu, sprawdź, czy obrazy są większe niż rozmiar przycisku. Zawsze używaj obrazów @ 2x i @ 3x dla rozdzielczości siatkówki.
źródło
Te dwie rzeczy (które na początku są dość trudne do znalezienia) rozciągną twój obraz UIButton, aby dopasować go do rozmiaru przycisku:
należy zawsze próbować ustawić takie w Storyboard, a nie w kodzie.
źródło