UIButton具有固定大小的自定义图像

时间:2012-03-14 22:43:58

标签: iphone objective-c ios ipad uibutton

我有一个自定义UIButton如下:

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

我拥有的真实图像实际上是以10x10为中心,居中,我希望它保持这种状态而不是缩放到按钮大小。我该怎么做?

修订后的代码:

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

仍在缩放

6 个答案:

答案 0 :(得分:2)

使用setImage:forState:代替UIButton

setBackgroundImage:forState:方法

UIButton继承自UIControl,因此您可以将contentHorizontalAlignmentcontentVerticalAlignment属性分别设置为UIControlContentHorizontalAlignmentCenterUIControlContentVerticalAlignmentCenter(尽管在大多数情况下这些都是默认值。)

答案 1 :(得分:2)

为此我认为你需要使用图像insets属性UIButton Class Reference

答案 2 :(得分:2)

Swift 3的工作示例希望它有所帮助

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

}

答案 3 :(得分:1)

可以尝试这样的事情......

 [button addSubview:imageView];

其中imageView包含图像;

答案 4 :(得分:0)

使用setContentMode

[action setContentMode:UIViewContentModeCenter];

答案 5 :(得分:0)

包含QuartzCore框架并更改图层上的重力。

action.layer.contentsGravity=kCAGravityCenter;