Chcę dodać obraz do UIButton, a także chcę przeskalować mój obraz, aby pasował do UIButton (pomniejszyć obraz). Pokaż mi, proszę, jak to zrobić.
Oto, czego próbowałem, ale to nie działa:
- Dodanie obrazu do przycisku i użycie
setContentMode
:
[self.itemImageButton setImage:stretchImage forState:UIControlStateNormal];
[self.itemImageButton setContentMode:UIViewContentModeScaleAspectFit];
- Tworzenie „rozciągniętego obrazu”:
UIImage *stretchImage = [updatedItem.thumbnail stretchableImageWithLeftCapWidth:0 topCapHeight:0];
Odpowiedzi:
Jeśli naprawdę chcesz przeskalować obraz, zrób to, ale przed użyciem zmień jego rozmiar. Zmiana rozmiaru w czasie wykonywania spowoduje po prostu utratę cykli procesora.
Oto kategoria, której używam do skalowania obrazu:
UIImage + Extra.h
@interface UIImage (Extras) - (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize; @end;
UIImage + Extra.m
@implementation UIImage (Extras) - (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize { UIImage *sourceImage = self; UIImage *newImage = nil; CGSize imageSize = sourceImage.size; CGFloat width = imageSize.width; CGFloat height = imageSize.height; CGFloat targetWidth = targetSize.width; CGFloat targetHeight = targetSize.height; CGFloat scaleFactor = 0.0; CGFloat scaledWidth = targetWidth; CGFloat scaledHeight = targetHeight; CGPoint thumbnailPoint = CGPointMake(0.0,0.0); if (!CGSizeEqualToSize(imageSize, targetSize)) { CGFloat widthFactor = targetWidth / width; CGFloat heightFactor = targetHeight / height; if (widthFactor < heightFactor) scaleFactor = widthFactor; else scaleFactor = heightFactor; scaledWidth = width * scaleFactor; scaledHeight = height * scaleFactor; // center the image if (widthFactor < heightFactor) { thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; } else if (widthFactor > heightFactor) { thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5; } } // this is actually the interesting part: UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0); CGRect thumbnailRect = CGRectZero; thumbnailRect.origin = thumbnailPoint; thumbnailRect.size.width = scaledWidth; thumbnailRect.size.height = scaledHeight; [sourceImage drawInRect:thumbnailRect]; newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); if(newImage == nil) NSLog(@"could not scale image"); return newImage ; } @end
Możesz go użyć do żądanego rozmiaru. Lubić :
[self.itemImageButton setImage:[stretchImage imageByScalingProportionallyToSize:CGSizeMake(20,20)]];
źródło
UIGraphicsBeginImageContext
zamiastUIGraphicsBeginImageContextWithOptions
. Właśnie to naprawiłem.Miałem ten sam problem. Wystarczy ustawić ContentMode ImageView, który znajduje się wewnątrz UIButton.
[[self.itemImageButton imageView] setContentMode: UIViewContentModeScaleAspectFit]; [self.itemImageButton setImage:[UIImage imageNamed:stretchImage] forState:UIControlStateNormal];
Mam nadzieję że to pomoże.
źródło
imageView.contentMode
, typemNumber
i wartością1
Żadna z odpowiedzi tutaj naprawdę nie zadziałała, rozwiązałem problem za pomocą następującego kodu:
button.contentMode = UIViewContentModeScaleToFill; button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
Możesz to również zrobić w programie Interface Builder.
źródło
Aspect fit
zamiastscale to fill
.Najłatwiejszy sposób na programowe ustawienie UIButton imageView w trybie dopasowania proporcji :
Szybki
Cel C
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill; button.imageView.contentMode = UIViewContentModeScaleAspectFit;
Uwaga: możesz zmienić .scaleAspectFit (UIViewContentModeScaleAspectFit) na .scaleAspectFill (UIViewContentModeScaleAspectFill), aby ustawić tryb wypełniania proporcji
źródło
Miałem problemy z nieproporcjonalną zmianą rozmiaru obrazu, więc naprawiłem to za pomocą wstawek krawędziowych.
fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);
źródło
Można to teraz zrobić za pomocą właściwości UIButton IB. Kluczem jest ustawienie obrazu jako tła, w przeciwnym razie to nie zadziała.
źródło
Rozwijając odpowiedź Dave'a, możesz ustawić wszystkie
contentMode
przyciskiimageView
w IB, bez żadnego kodu, używając atrybutów środowiska wykonawczego:1
znaczyUIViewContentModeScaleAspectFit
,2
znaczyłobyUIViewContentModeScaleAspectFill
.źródło
Jeśli chcesz po prostu zmniejszyć obraz przycisku:
yourButton.contentMode = UIViewContentModeScaleAspectFit; yourButton.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10);
źródło
1 - wyczyść domyślny tekst przycisku (ważne)
2 - ustaw wyrównanie jak obraz
3 - ustaw tryb treści, taki jak obraz
źródło
Mam metodę, która robi to za mnie. Metoda przyjmuje
UIButton
i dopasowuje proporcje obrazu.-(void)makeImageAspectFitForButton:(UIButton*)button{ button.imageView.contentMode=UIViewContentModeScaleAspectFit; button.contentHorizontalAlignment=UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment=UIControlContentVerticalAlignmentFill; }
źródło
Najczystszym rozwiązaniem jest użycie Auto Layout . Spuściłem Content Compression Resistance Priorytet z moich
UIButton
i ustawić obraz (nie Tło obrazu ) za pośrednictwem interfejsu Builder . Potem dodałem kilka ograniczeń, które definiują rozmiar mojego przycisku (dość skomplikowanego w moim przypadku) i działało to jak urok.źródło
Background Image
upewnij się, że ustawiłeś obraz na właściwość Image, ale nie na Background
źródło
Obraz tła można w rzeczywistości ustawić tak, aby dość łatwo skalował wypełnienie według aspektu. Wystarczy zrobić coś takiego w podklasie UIButton:
- (CGRect)backgroundRectForBounds:(CGRect)bounds { // you'll need the original size of the image, you // can save it from setBackgroundImage:forControlState return CGRectFitToFillRect(__original_image_frame_size__, bounds); } // Utility function, can be saved elsewhere CGRect CGRectFitToFillRect( CGRect inRect, CGRect maxRect ) { CGFloat origRes = inRect.size.width / inRect.size.height; CGFloat newRes = maxRect.size.width / maxRect.size.height; CGRect retRect = maxRect; if (newRes < origRes) { retRect.size.width = inRect.size.width * maxRect.size.height / inRect.size.height; retRect.origin.x = roundf((maxRect.size.width - retRect.size.width) / 2); } else { retRect.size.height = inRect.size.height * maxRect.size.width / inRect.size.width; retRect.origin.y = roundf((maxRect.size.height - retRect.size.height) / 2); } return retRect; }
źródło
Swift 5.0
źródło
W przypadku platformy Xamarin.iOS (C #):
myButton.VerticalAlignment = UIControlContentVerticalAlignment.Fill; myButton.HorizontalAlignment = UIControlContentHorizontalAlignment.Fill; myButton.ImageView.ContentMode = UIViewContentMode.ScaleAspectFit;
źródło
Wystarczy ustawić tryb treści widoku obrazu UIButton dla trzech zdarzeń. -
[cell.button setImage:[UIImage imageWithData:data] forState:UIControlStateNormal]; [cell.button setImage:[UIImage imageWithData:data] forState:UIControlStateHighlighted]; [cell.imgIcon setImage:[UIImage imageWithData:data] forState:UIControlStateSelected];
Mamy kod dla trzech zdarzeń bcoz podczas podświetlania lub wybierania, jeśli rozmiar przycisku to KWADRAT, a rozmiar obrazu to prostokąt, to pokaże kwadratowy obraz w momencie podświetlania lub wybierania.
Jestem pewien, że to zadziała.
źródło