Làm cách nào để điều chỉnh kích thước hình ảnh của UIButton?


158

Làm cách nào để điều chỉnh kích thước hình ảnh của UIButton? Tôi đang thiết lập hình ảnh như thế này:

[myLikesButton setImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];

Tuy nhiên, điều này sẽ lấp đầy hình ảnh đến nút đầy đủ, làm cách nào để làm cho hình ảnh nhỏ hơn?


6
Bạn đã thử làm cho hình ảnh nhỏ hơn (LOL)?
CodaFi

1
@CodaFi là đúng, bạn thường nên cung cấp tài sản ở kích thước phù hợp vì nó làm giảm bất kỳ công việc nào cho CPU, sử dụng ít bộ nhớ hơn và rất có thể sẽ trông tốt hơn vì bạn không có khả năng giới thiệu bất kỳ đồ tạo tỷ lệ nào ...
Paul.s

Ngoài ra, bạn có thể đặt nút theo kích thước của hình ảnh (hoặc ngược lại). Tại sao bạn có một nút lớn ... với một hình ảnh nhỏ trong đó. Đồng thời thêm hình ảnh bạn muốn, đó là những nút tùy chỉnh dành cho hoặc bạn có thể giải thích logic bạn muốn thực hiện cho người khác để có một ý tưởng rõ ràng.
Abhishek Singh

Câu trả lời:


243

Nếu tôi hiểu chính xác những gì bạn đang cố gắng làm, bạn cần chơi với các nút hình ảnh cạnh nút. Cái gì đó như:

myLikesButton.imageEdgeInsets = UIEdgeInsets(top, left, bottom, right)

96

Câu trả lời của Tim là chính xác, tuy nhiên tôi muốn thêm một đề nghị khác, vì trong trường hợp của tôi, có một giải pháp đơn giản hơn hoàn toàn.

Tôi đang tìm cách đặt các UIButtonphần tử hình ảnh vì tôi không nhận ra rằng tôi có thể đặt chế độ nội dung trên nút UIImageView, điều này sẽ ngăn không cho sử dụng UIEdgeInsets và các giá trị được mã hóa hoàn toàn. Chỉ cần truy cập vào chế độ xem hình ảnh cơ bản trên nút và đặt chế độ nội dung:

myButton.imageView.contentMode = UIViewContentModeScaleAspectFit;

Xem UIButton không nghe cài đặt chế độ nội dung?

Swift 3

myButton.imageView?.contentMode = .scaleAspectFit

1
Làm thế nào để làm tương tự cho BackgroundImage?
Serge Sahakyan

myButton.backgroundImageView? .contentMode = .scaleAspectFit
Andrea.Ferrando

@ Andrea.Ferrando button.backgroundImageView.contentModekhông hoạt động
Seong Lee

Hãy tiết kiệm thời gian và đảm bảo rằng bạn đang đặt hình ảnh chứ không phải hình nền! @SeongLee là chính xác, bạn không thể thao tác hình nền với contentMode hoặc EdgeInserts
redPanda

41

Swift 3:

button.setImage(UIImage(named: "checkmark_white"), for: .normal)
button.contentVerticalAlignment = .fill
button.contentHorizontalAlignment = .fill
button.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)

5
Điều này làm việc rất đẹp cho tôi. Tôi đã tạo một biểu tượng PDF trong Inkscape và các contentVerticalAlignment/contentHorizontalAlignmenttùy chọn đã cho phép tôi mở rộng quy mô theo cách mà tôi hy vọng. Cảm ơn vì đã đăng tải điều này.
Adrian

1
thiết lập contentHorizontalAlignmentcontentVerticalAlignmentthực hiện mánh khóe
Tom Knapen 14/11/18

Giải pháp này hoạt động tuyệt vời khi sử dụng tài sản PDF cho các biểu tượng. Cảm ơn bạn!
Eneko Alonso

38

Bạn cũng có thể làm điều đó từ người xây dựng inteface như thế này.

nhập mô tả hình ảnh ở đây

Tôi nghĩ nó hữu ích.


26

Nếu hình ảnh của bạn quá lớn (và bạn không thể / không muốn làm cho hình ảnh nhỏ hơn), sự kết hợp của hai câu trả lời đầu tiên sẽ rất tuyệt.

addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(15.0, 15.0, 15.0, 5.0)

Trừ khi bạn có được hình ảnh chèn vừa phải, hình ảnh sẽ bị lệch mà không thay đổi contentMode.


23

bạn có thể sử dụng thuộc imageEdgeInsetstính Các lề trong hoặc ngoài cho hình chữ nhật xung quanh hình ảnh của nút.

 [self.btn setImageEdgeInsets:UIEdgeInsetsMake(6, 6, 6, 6)];

Một giá trị dương co lại, hoặc chèn, cạnh đó di chuyển. Một giá trị âm mở rộng, hoặc đặt ra, cạnh đó.


17

Đây là giải pháp khác để chia tỷ lệ imageView của UIButton.

button.imageView?.layer.transform = CATransform3DMakeScale(0.8, 0.8, 0.8)

Bạn đã cứu ngày của tôi. Tôi chỉ muốn thu nhỏ hình ảnh của mình trong một nút. Không có nội dung không có gì, cảm ơn!
Pedro Antonio

15

Đây là phiên bản Swift:

myButton.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)

8

Swift 4

Bạn sẽ cần sử dụng hai dòng mã này, theo thứ tự cụ thể này. Tất cả những gì bạn cần là thay đổi giá trị trên cùng và dưới cùng của các miếng đệm cạnh.

addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(10.0, 0.0, 10.0, 0.0)

Những điều này gây ra một EXC_BAD_ACCESSlỗi khi được gọi từ override func layoutSubviews().
Andrew Kirna

7

Với sự giúp đỡ của câu trả lời của Tim C , tôi đã có thể tạo tiện ích mở rộng UIButtonbằng cách sử dụng Swift cho phép bạn chỉ định khung hình ảnh bằng cách sử dụng .setImage()chức năng có thêm frametham số

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
            )
        }
    }

}

Sử dụng cái này, nếu bạn muốn đặt khung hình UIButtonthành CGRectMake(0, 0, 64, 64)và đặt hình ảnh của nó thành myImagekhung hình CGRectMake(8, 8, 48, 48), bạn có thể sử dụng

let button: UIButton = UIButton(frame: CGRectMake(0, 0, 64, 64))
button.setImage(
    myImage,
    inFrame: CGRectMake(8, 8, 48, 48),
    forState: UIControlState.Normal
)

4
Bạn nên if letthay vì kiểm tra nếu framenilvà sau đó buộc hủy kết nối một tỷ lần .
fpg1503

7

Khi thay đổi kích thước biểu tượng với UIEdgeInsetsMake(top, left, bottom, right) , hãy ghi nhớ kích thước nút và khả năng UIEdgeInsetsMake hoạt động với các giá trị âm như thể chúng là dương.

Ví dụ: Hai nút có chiều cao 100 và khía cạnh 1: 1.

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)

nhập mô tả hình ảnh ở đây

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(45, 0, 45, 0)

nhập mô tả hình ảnh ở đây

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(60, 0, 60, 0)

nhập mô tả hình ảnh ở đây

Các ví dụ 1 và 3 giống hệt nhau vì ABS (100 - (40 + 40)) = ABS (100 - (60 + 60))


2

Swift 3

Tôi đặt myButton chiều rộng và chiều cao thành 40 và phần đệm của tôi từ EdgeInsetsMake là 15 tất cả các mặt. Tôi đề nghị thêm màu nền vào nút của bạn để xem phần đệm thực tế.

myButton.backgroundColor = UIColor.gray // sample color to check padding
myButton.imageView?.contentMode = .scaleAspectFit
myButton.imageEdgeInsets = UIEdgeInsetsMake(15, 15, 15, 15)

2

Một cách tiếp cận là thay đổi kích thước UIImage theo mã như sau. Lưu ý: mã này chỉ chia tỷ lệ theo chiều cao, nhưng bạn cũng có thể dễ dàng điều chỉnh chức năng theo tỷ lệ theo chiều rộng.

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!
}

2

Đã cập nhật cho Swift> 5

đặt kích thước:

button.frame = CGRect(x: 0, y: 0, width: 44, height: 44)

đặt lề:

button.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)

1

Đã cập nhật cho Swift 3

yourButtonName.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)

-6

Tôi nghĩ rằng, kích thước hình ảnh của bạn cũng giống như kích thước nút sau đó bạn đặt hình ảnh trong nền của nút như:

[myLikesButton setBackgroundImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];

bạn có cùng kích thước của hình ảnh và nút. Tôi hy vọng bạn hiểu quan điểm của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.