2012-03-14 17 views
5

mam niestandardową UIButton następująco:UIButton ze stałym rozmiarze niestandardowym obrazem

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

Prawdziwy obraz, który mam jest rzeczywiście wielkości w 10x10, skupione i chcę go zatrzymać w ten sposób i nie skalowane do rozmiar guzika. Jak mogę to zrobić?

zmieniony kodeks:

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

który nadal skalowania

Odpowiedz

1

Może spróbować czegoś liky to ...

[button addSubview:imageView]; 

gdzie ImageView zawierającego obraz;

2

zastosować metodę UIButton zamiast setBackgroundImage:forState:

UIButton dziedziczy setImage:forState: z UIControl, więc można ustawić contentHorizontalAlignment i contentVerticalAlignment właściwości UIControlContentHorizontalAlignmentCenter i UIControlContentVerticalAlignmentCenter, odpowiednio (chociaż w większości przypadków są to już wartości domyślne).

+0

Zmieniłem w użyciu setImage, jak mogę ustawić contentHorizontalAlignment – adit

+0

Jest jeszcze skalowania do rozmiaru UIButton – adit

0

użytkowania setContentMode

[action setContentMode:UIViewContentModeCenter]; 
0

Dołącz QuartzCore ramy i zmiana grawitacji na warstwie.

action.layer.contentsGravity=kCAGravityCenter; 
1

przykład Praca dla Swift 3 nadzieję, że pomoże

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

} 
Powiązane problemy