Jak mogę dostosować rozmiar obrazu przycisku UIButton? Ustawiam obraz tak:
[myLikesButton setImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];
Jednak to wypełnia obraz do całego przycisku, jak zmniejszyć obraz?
Jak mogę dostosować rozmiar obrazu przycisku UIButton? Ustawiam obraz tak:
[myLikesButton setImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];
Jednak to wypełnia obraz do całego przycisku, jak zmniejszyć obraz?
Odpowiedzi:
Odpowiedź Tima jest poprawna, jednak chciałem dodać kolejną sugestię, ponieważ w moim przypadku było w sumie prostsze rozwiązanie.
Chciałem ustawić UIButton
wstawki obrazu, ponieważ nie zdawałem sobie sprawy, że mogę ustawić tryb treści na przycisku UIImageView
, co całkowicie wyeliminowałoby potrzebę używania UIEdgeInsets i wartości zakodowanych na stałe. Po prostu uzyskaj dostęp do podstawowego widoku obrazu za pomocą przycisku i ustaw tryb treści:
myButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
Widzisz, UIButton nie nasłuchuje ustawienia trybu treści?
Szybki 3
myButton.imageView?.contentMode = .scaleAspectFit
button.backgroundImageView.contentMode
nie działa
Swift 3:
button.setImage(UIImage(named: "checkmark_white"), for: .normal)
button.contentVerticalAlignment = .fill
button.contentHorizontalAlignment = .fill
button.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)
contentVerticalAlignment/contentHorizontalAlignment
opcje pozwoliły mi skalować ją tak, jak miałem nadzieję. Dziękuję za wysłanie tego.
contentHorizontalAlignment
i contentVerticalAlignment
załatwiło sprawę
Jeśli obraz jest za duży (i nie możesz / nie chcesz po prostu pomniejszyć obrazu), połączenie dwóch pierwszych odpowiedzi działa świetnie.
addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(15.0, 15.0, 15.0, 5.0)
O ile wstawki obrazu nie są prawidłowe, obraz zostanie przekrzywiony bez zmiany rozszerzenia contentMode
.
you can use imageEdgeInsets
property Marginesy wewnętrzne lub początkowe prostokąta wokół obrazu przycisku.
[self.btn setImageEdgeInsets:UIEdgeInsetsMake(6, 6, 6, 6)];
Dodatnia wartość zmniejsza lub wstawia tę krawędź - w ruchu. Ujemna wartość rozszerza lub przewyższa tę krawędź.
Oto inne rozwiązanie do skalowania imageView z UIButton.
button.imageView?.layer.transform = CATransform3DMakeScale(0.8, 0.8, 0.8)
Oto wersja Swift:
myButton.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
Szybki 4
Będziesz musiał użyć tych dwóch wierszy kodu w tej określonej kolejności. Wystarczy zmienić górną i dolną wartość wstawek krawędziowych.
addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(10.0, 0.0, 10.0, 0.0)
EXC_BAD_ACCESS
błąd podczas wywołania z override func layoutSubviews()
.
Z pomocą odpowiedzi Tima C. udało mi się stworzyć rozszerzenie dotyczące UIButton
korzystania z języka Swift, które pozwala określić ramkę obrazu za pomocą .setImage()
funkcji z dodatkowym frame
parametrem
extension UIButton{
func setImage(image: UIImage?, inFrame frame: CGRect?, forState state: UIControlState){
self.setImage(image, forState: state)
if let frame = frame{
self.imageEdgeInsets = UIEdgeInsets(
top: frame.minY - self.frame.minY,
left: frame.minX - self.frame.minX,
bottom: self.frame.maxY - frame.maxY,
right: self.frame.maxX - frame.maxX
)
}
}
}
Używając tego, jeśli chcesz ustawić ramkę a UIButton
na CGRectMake(0, 0, 64, 64)
i ustawić jej obraz myImage
z ramką CGRectMake(8, 8, 48, 48)
, możesz użyć
let button: UIButton = UIButton(frame: CGRectMake(0, 0, 64, 64))
button.setImage(
myImage,
inFrame: CGRectMake(8, 8, 48, 48),
forState: UIControlState.Normal
)
if let
zamiast sprawdzać, czy frame
jest, nil
a następnie wymusić rozpakowanie miliardów razy .
Zmieniając rozmiar ikony za pomocą
UIEdgeInsetsMake(top, left, bottom, right)
, należy pamiętać o wymiarach przycisków i możliwościach UIEdgeInsetsMake do pracy z wartościami ujemnymi tak, jakby były dodatnie.
Przykład: dwa przyciski o wysokości 100 i proporcjach 1: 1.
left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(45, 0, 45, 0)
left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(60, 0, 60, 0)
Przykłady 1 i 3 są identyczne, ponieważ ABS (100 - (40 + 40)) = ABS (100 - (60 + 60))
Szybki 3
Ustawiam szerokość i wysokość myButton na 40, a moje wypełnienie z EdgeInsetsMake to 15 ze wszystkich stron. Proponuję dodać kolor tła do przycisku, aby zobaczyć rzeczywiste wypełnienie.
myButton.backgroundColor = UIColor.gray // sample color to check padding
myButton.imageView?.contentMode = .scaleAspectFit
myButton.imageEdgeInsets = UIEdgeInsetsMake(15, 15, 15, 15)
Jedną z metod jest zmiana rozmiaru UIImage w kodzie, jak poniżej. Uwaga: ten kod skaluje się tylko według wysokości, ale można łatwo dostosować funkcję również do skalowania według szerokości.
let targetHeight = CGFloat(28)
let newImage = resizeImage(image: UIImage(named: "Image.png")!, targetHeight: targetHeight)
button.setImage(newImage, for: .normal)
fileprivate func resizeImage(image: UIImage, targetHeight: CGFloat) -> UIImage {
// Get current image size
let size = image.size
// Compute scaled, new size
let heightRatio = targetHeight / size.height
let newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)
// Create new image
UIGraphicsBeginImageContextWithOptions(newSize, false, 0)
image.draw(in: rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
// Return new image
return newImage!
}
Myślę, że rozmiar obrazu jest taki sam jak rozmiar przycisku, a następnie umieszczasz obraz w tle przycisku, na przykład:
[myLikesButton setBackgroundImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];
masz maszt ma ten sam rozmiar obrazu i przycisku. Mam nadzieję, że rozumiesz mój punkt widzenia.