UIButton с фиксированным размером пользовательского изображения - PullRequest
5 голосов
/ 15 марта 2012

У меня есть пользовательская кнопка UIB следующим образом:

 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 ]

2 голосов
/ 04 сентября 2017

Рабочий пример для 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()
    }

}
2 голосов
/ 15 марта 2012

для этого, я думаю, вам нужно использовать свойство вставок изображения UIButton Class Reference

2 голосов
/ 15 марта 2012

Используйте setImage:forState: метод UIButton вместо setBackgroundImage:forState:

UIButton наследуется от UIControl, поэтому вы можете установить свойства contentHorizontalAlignment и contentVerticalAlignment на UIControlContentHorizontalAlignmentCenter и UIControlContentVerticalAlignmentCenter соответственно (хотя в большинстве случаев это уже значения по умолчанию).

1 голос
/ 15 марта 2012

Может быть, попробовать что-нибудь подобное ...

 [button addSubview:imageView];

, где imageView содержит изображение;

0 голосов
/ 15 марта 2012

Включите каркас QuartzCore и измените гравитацию на слое.

action.layer.contentsGravity=kCAGravityCenter;
0 голосов
/ 15 марта 2012

использовать setContentMode

[action setContentMode:UIViewContentModeCenter];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...