[Iphone] UIButton con imagen personalizada de tamaño fijo


Answers

Use el setImage:forState: de UIButton lugar de setBackgroundImage:forState:

UIButton hereda de UIControl , por lo que puede establecer las propiedades contentHorizontalAlignment y contentVerticalAlignment en UIControlContentHorizontalAlignmentCenter y UIControlContentVerticalAlignmentCenter , respectivamente (aunque en la mayoría de los casos estos ya son los valores predeterminados).

Question

Tengo un UIButton personalizado de la siguiente manera:

 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];

La imagen real que tengo es en realidad de 10x10, centrada y quiero que permanezca así y no se ajuste al tamaño del botón. ¿Cómo puedo hacer eso?

CÓDIGO REVISADO:

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];

que aún está escalando




Un ejemplo de trabajo para Swift 3 espero que ayude

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

}



Incluye el marco QuartzCore y cambia la gravedad en la capa.

action.layer.contentsGravity=kCAGravityCenter;