Utworzyłem instancję UIButton o nazwie „przycisk” z obrazem przy użyciu [UIButton setImage:forState:]
. Rozmiar button.frame jest większy niż rozmiar obrazu.
Teraz chcę zmniejszyć rozmiar obrazu tego przycisku. Próbowałem zmienia button.imageView.frame
, button.imageView.bounds
i button.imageView.contentMode
, ale wszystkie wydają się nieskuteczne.
Czy ktoś może mi pomóc w skalowaniu UIButton
imageView?
Stworzyłem UIButton
tak:
UIButton *button = [[UIButton alloc] init];
[button setImage:image forState:UIControlStateNormal];
Próbowałem skalować obraz w ten sposób:
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
button.imageView.bounds = CGRectMake(0, 0, 70, 70);
i to:
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
button.imageView.frame = CGRectMake(0, 0, 70, 70);
Miałem podobny problem, gdzie mam obraz tła (jeden z obramowaniem) i obraz (flaga) dla niestandardowego przycisku. Chciałem, aby flaga była pomniejszona i na środku. Próbowałem zmienić atrybut imageView, ale nie udało mi się i widziałem ten obraz -
Podczas moich eksperymentów próbowałem:
button.imageEdgeInsets = UIEdgeInsetsMake(kTop,kLeft,kBottom,kRight)
Osiągnąłem oczekiwany rezultat jako:
źródło
Dodatkowy sposób konfiguracji w pliku XIB. Możesz wybrać tę opcję, jeśli chcesz, aby tekst lub obraz był wypełniony pełną skalą w UIButton. Tak samo będzie z kodem.
UIButton *btn = [UIButton new]; btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; btn.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
źródło
posługiwać się
button.contentMode = UIViewContentModeScaleToFill;
nie
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
Aktualizacja:
Jak skomentował @Chris,
źródło
UIButton *button= [[UIButton alloc] initWithFrame:CGRectMake(0,0,70,70)]; button.buttonType = UIButtonTypeCustom; UIImage *buttonImage = [UIImage imageNamed:@"image.png"]; UIImage *stretchableButtonImage = [buttonImage stretchableImageWithLeftCapWidth:12 topCapHeight:0]; [button setBackgroundImage:stretchableButtonImage forState:UIControlStateNormal];
źródło
Znalazłem to rozwiązanie.
1) Podklasuj następujące metody
UIButton
+ (id)buttonWithType:(UIButtonType)buttonType { MyButton *toReturn = [super buttonWithType:buttonType]; toReturn.imageView.contentMode = UIViewContentModeScaleAspectFit; return toReturn; } - (CGRect)imageRectForContentRect:(CGRect)contentRect { return contentRect; }
I działa dobrze.
źródło
Dziwne, jedyne combo, które działało dla mnie (iOS 5.1) to ...
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
i
[button setImage:newImage forState:UIControlStateNormal];
źródło
Po prostu zrób (z projektu lub z kodu):
Od projektu
[Dla punktu 3: Zmień wyrównanie w poziomie i w pionie na
UIControlContentHorizontalAlignmentFill and UIControlContentVericalAlignmentFill]
Z Code
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
źródło
Właśnie napotkałem ten sam problem i jest możliwa odpowiedź na to pytanie:
Dlaczego niestandardowy obraz UIButton nie zmienia rozmiaru w programie Interface Builder?
Zasadniczo należy zamiast tego użyć właściwości backgroundimage, która jest skalowana.
źródło
w ten sposób może rozwiązać twój problem:
+ (UIImage*)resizedImage:(UIImage*)image { CGRect frame = CGRectMake(0, 0, 60, 60); UIGraphicsBeginImageContext(frame.size); [image drawInRect:frame]; UIImage* resizedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return resizedImage; }
źródło
Z małego testu, który właśnie zrobiłem po przeczytaniu tutaj, zależy, czy używasz setImage czy setBackgroundImage, oba dały ten sam wynik i rozciągnęły obraz
//for setBackgroundImage self.imageButton.contentMode = UIViewContentModeScaleAspectFill; [self.imageButton setBackgroundImage:[UIImage imageNamed:@"imgFileName"] forState:UIControlStateNormal]; //for setImage self.imageButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; self.imageButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill; [self.imageButton setImage:[UIImage imageNamed:@"imgFileName"] forState:UIControlStateNormal];
źródło
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
źródło
To również zadziała, ponieważ backgroundImage automatycznie się skaluje
[button setBackgroundImage:image forState:UIControlStateNormal];
źródło
Storyboard
Musisz zdefiniować określoną właściwość w Runtime Attributes of Identity inspector -
imageView.contentModel
, gdzie ustawiasz wartość względemrawValue
pozycji wyliczeniaUIViewContentMode
. 1 oznacza scaleAspectFit .I wyrównanie przycisku w Inspektorze atrybutów :
źródło
Nie mogę uzyskać rozwiązania używanego przez _imageView, ale mogę
CGContextRef
go rozwiązać za pomocą a. UżywaUIGraphicsGetCurrentContext
do pobrania currentContextRef i narysowania obrazu w currentContextRef, a następnie skaluje lub obraca obraz i tworzy nowy obraz. Ale to nie jest idealne.kod:
-(UIImage*) scaleAndRotateImage:(UIImage*)photoimage width:(CGFloat)bounds_width height:(CGFloat)bounds_height; { CGImageRef imgRef = photoimage.CGImage; CGFloat width = CGImageGetWidth(imgRef); CGFloat height = CGImageGetHeight(imgRef); CGAffineTransform transform = CGAffineTransformIdentity; CGRect bounds = CGRectMake(0, 0, width, height); bounds.size.width = bounds_width; bounds.size.height = bounds_height; CGFloat scaleRatio = bounds.size.width / width; CGFloat scaleRatioheight = bounds.size.height / height; CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); CGFloat boundHeight; UIImageOrientation orient = photoimage.imageOrientation; switch(orient) { case UIImageOrientationUp: //EXIF = 1 transform = CGAffineTransformIdentity; break; case UIImageOrientationUpMirrored: //EXIF = 2 transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0); transform = CGAffineTransformScale(transform, -1.0, 1.0); break; case UIImageOrientationDown: //EXIF = 3 transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height); transform = CGAffineTransformRotate(transform, M_PI); break; case UIImageOrientationDownMirrored: //EXIF = 4 transform = CGAffineTransformMakeTranslation(0.0, imageSize.height); transform = CGAffineTransformScale(transform, 1.0, -1.0); break; case UIImageOrientationLeftMirrored: //EXIF = 5 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width); transform = CGAffineTransformScale(transform, -1.0, 1.0); transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); break; case UIImageOrientationLeft: //EXIF = 6 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(0.0, imageSize.width); transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); break; case UIImageOrientationRightMirrored: //EXIF = 7 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeScale(-1.0, 1.0); transform = CGAffineTransformRotate(transform, M_PI / 2.0); break; case UIImageOrientationRight: //EXIF = 8 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0); transform = CGAffineTransformRotate(transform, M_PI / 2.0); break; default: [NSException raise:NSInternalInconsistencyException format:@"Invalid?image?orientation"]; break; } UIGraphicsBeginImageContext(bounds.size); CGContextRef context = UIGraphicsGetCurrentContext(); if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) { CGContextScaleCTM(context, -scaleRatio, scaleRatioheight); CGContextTranslateCTM(context, -height, 0); } else { CGContextScaleCTM(context, scaleRatio, -scaleRatioheight); CGContextTranslateCTM(context, 0, -height); } CGContextConcatCTM(context, transform); CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef); UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return imageCopy; }
źródło
Mam nadzieję, że to pomoże komuś innemu:
Swift 3+
button.contentHorizontalAlignment = UIControlContentHorizontalAlignment.fill button.contentVerticalAlignment = UIControlContentVerticalAlignment.fill
źródło
Możesz modyfikować imageView przy użyciu niestandardowej klasy UIButton. Proszę zobaczyć moją odpowiedź. https://stackoverflow.com/a/59874762/5693826
źródło
od @JosephH
contentHorizontalAlignment = UIControl.ContentHorizontalAlignment.fill contentVerticalAlignment = UIControl.ContentVerticalAlignment.fill
źródło
Każdy UIButton ma swój własny ukryty widok UIImageView. Musimy więc ustawić tryb treści w sposób podany poniżej ...
[[btn imageView] setContentMode: UIViewContentModeScaleAspectFit]; [btn setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
źródło
W lewym dolnym rogu zrzutu ekranu możesz zobaczyć właściwości rozciągania. Spróbuj ich użyć.
źródło