UIButton with a custom sized image

I have a custom UIButton as follows:

 UIButton * action = [UIButton buttonWithType:UIButtonTypeCustom];
        [action setSize:CGSizeMake(30, 30)];
    [action setBackgroundImage:[UIImage imageNamed:@"contextaction.png"] forState:UIControlStateNormal];
    [action setContentMode:UIViewContentModeCenter];
    [action addTarget:self action:@selector(actionButtonPressed:) forControlEvents:UIControlEventTouchUpInside];

The real image that I have is actually 10x10 in the center, and I want it to stay that way and not scale to the size of the button. How to do it?

REVISED CODE:

UIButton * action = [UIButton buttonWithType:UIButtonTypeCustom];
    [action setSize:CGSizeMake(44, 44)];
    [action setImage:[UIImage imageNamed:@"contextaction.png"] forState:UIControlStateNormal];
    [action addTarget:self action:@selector(actionButtonPressed:) forControlEvents:UIControlEventTouchUpInside];

    if (IS_IPAD){
        action.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
        action.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
    }
     actionButton_ = [[UIBarButtonItem alloc] initWithCustomView:action];

which is still scalable

+5
source share
6 answers

for this i think you need to use the image insert property UIButton class reference

+2
source

Use a setImage:forState:method UIButtoninsteadsetBackgroundImage:forState:

UIButton UIControl, contentHorizontalAlignment contentVerticalAlignment UIControlContentHorizontalAlignmentCenter UIControlContentVerticalAlignmentCenter ( ).

+2

You can try something like that ...

 [button addSubview:imageView];

where imageView contains the image;

+1
source

Working example for Swift 3 hopes it helps

import UIKit

@IBDesignable
class MenuBtn: UIButton {

    convenience init() {
        self.init(frame: CGRect.zero)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupView()
    }

    func setupView(){
        imageView?.contentMode = .scaleAspectFit
        var image = imageView?.image
        image = image?.withRenderingMode(.alwaysTemplate)

    }

    override var isSelected: Bool {
        didSet {
            tintColor = super.isSelected ? .gray : .gray
        }
    }

    override func imageRect(forContentRect contentRect: CGRect) -> CGRect {
        let leftMargin:CGFloat = 40
        let imgWidth:CGFloat = 24
        let imgHeight:CGFloat = 24
        return CGRect(x: leftMargin, y: (contentRect.size.height-imgHeight) * 0.5, width: imgWidth, height: imgHeight)
    }

    override func titleRect(forContentRect contentRect: CGRect) -> CGRect {
        let leftMargin:CGFloat = 80
        let rightMargin:CGFloat = 80
        return CGRect(x: leftMargin, y: 0, width: contentRect.size.width-leftMargin-rightMargin, height: contentRect.size.height)
    }

   override func backgroundRect(forBounds bounds: CGRect) -> CGRect {
       let leftMargin:CGFloat = 10
       let rightMargin:CGFloat = 10
       let topMargin:CGFloat = 10
       let bottomMargin:CGFloat = 10
       return CGRect(x: leftMargin, y: topMargin, width: bounds.size.width-leftMargin-rightMargin, height: bounds.size.height-topMargin-bottomMargin)
    }


    override func contentRect(forBounds bounds: CGRect) -> CGRect {
        let leftMargin:CGFloat = 5
        let rightMargin:CGFloat = 5
        let topMargin:CGFloat = 5
        let bottomMargin:CGFloat = 5
        return CGRect(x: leftMargin, y: topMargin, width: bounds.size.width-leftMargin-rightMargin, height: bounds.size.height-topMargin-bottomMargin)
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        setupView()
    }

}
+1
source

use setContentMode

[action setContentMode:UIViewContentModeCenter];
0
source

Turn on the QuartzCore wireframe and change the gravity level.

action.layer.contentsGravity=kCAGravityCenter;
0
source

All Articles