iOS UIButton 设置图片文字垂直排列

http://my.oschina.net/sayonala/blog/198376

摘要  经过一下午的查阅资料及尝试,最终解决了在图片和文字垂直排列的情况下,如果文字长度变化会导致图片位置变动的问题。

    经过一下午的查阅资料及尝试,最终解决了在图片和文字垂直排列的情况下,如果文字长度变化会导致图片位置变动的问题,最开始采用了网上比较多的做法,做法如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@interface UIButton (UIButtonExt)  
- ( void )centerImageAndTitle:( float )space;  
- ( void )centerImageAndTitle;  
@end  
 
@implementation UIButton (UIButtonExt)  
- ( void )centerImageAndTitle:( float )spacing  
{      
     // get the size of the elements here for readability  
     CGSize imageSize = self.imageView.frame.size;  
     CGSize titleSize = self.titleLabel.frame.size;  
 
     // get the height they will take up as a unit  
     CGFloat totalHeight = (imageSize.height + titleSize.height + spacing);  
 
     // raise the image and push it right to center it  
     self.imageEdgeInsets = UIEdgeInsetsMake(- (totalHeight - imageSize.height), 0.0, 0.0, - titleSize.width);  
 
     // lower the text and push it left to center it  
     self.titleEdgeInsets = UIEdgeInsetsMake(0.0, - imageSize.width, - (totalHeight - titleSize.height),0.0);      
}  
 
- ( void )centerImageAndTitle  
{  
     const  int  DEFAULT_SPACING = 6.0f;  
     [self centerImageAndTitle:DEFAULT_SPACING];  
  }  
@end

    后面经过测试,如果button的文字长度变更,会导致图片位置变化,经过多次修改UIEdgeInsets的值也没有达到期望效果,最终采用集成UIButton类,重写layoutSubviews函数实现,特将成果记录一下,以便后续查阅

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-( void )layoutSubviews {
     [super layoutSubviews];
 
     // Center image
     CGPoint center = self.imageView.center;
     center.x = self.frame.size.width/2;
     center.y = self.imageView.frame.size.height/2;
     self.imageView.center = center;
 
     //Center text
     CGRect newFrame = [self titleLabel].frame;
     newFrame.origin.x = 0;
     newFrame.origin.y = self.imageView.frame.size.height + 5;
     newFrame.size.width = self.frame.size.width;
 
     self.titleLabel.frame = newFrame;
     self.titleLabel.textAlignment = UITextAlignmentCenter;
}

通过重写,重新设置imageView的Center和titleLabel的Frame解决上述问题。


========================我是分割线,自己写得====

==========================自适应大小的按钮==========================

//

//  DHUIImageButton.m

//  IosAppTest

//

//  Created by zyx on 15/4/17.

//  Copyright (c) 2015 zyx. All rights reserved.

//


#import "DHUIImageButton.h"


@implementation DHUIImageButton


//+ (UIButton*) createImageButton:(NSString*) title imgNormal:(NSString*)imgNormal imgHover:(NSString*)imgHover

//{

//    if (imgNormal == nil) {

//        return nil;

//    }

//    NSString* txtLabel = title;

//    

//    UIFont* labelFont = [UIFont systemFontOfSize:[UIFont systemFontSize]];

//    CGSize textLabelSize = [txtLabel sizeWithFont:labelFont];

//    //    CGSize textLabelSize = [txtLabel sizeWithFont:[UIFont systemFontOfSize:17]];

//    

//    UIImage* img = [UIImage imageNamed: imgNormal];

//    CGSize imgSize = [img size];

////    imgSize.width = imgSize.width/2;

////    imgSize.height = imgSize.height/2;

//    

//    UIButton* liveButton = [UIButton buttonWithType:UIButtonTypeCustom] ;

//    int btnImageWidth = imgSize.width;

//    int btnImageHeight = imgSize.height;

//    int btnLabelWidth = textLabelSize.width;

//    int btnLabelHeight = textLabelSize.height;

//    int btnPaddingLeft = 0;

//    int btnPaddingRight = 0;

//    int btnPaddingTop = 0;

//    int btnPaddingBottom = 0;

//    int btnSpacing = 0;

//    int btnWidth = MAX(btnImageWidth, btnLabelWidth) + btnPaddingLeft + btnPaddingRight;

//    int btnHeight = btnImageHeight + btnSpacing + btnLabelHeight + btnPaddingTop + btnPaddingBottom;

//    liveButton.frame = CGRectMake(0, 0, btnWidth, btnHeight);

//    liveButton.backgroundColor = [UIColor greenColor];

//    [liveButton setImage:[UIImage imageNamed:imgNormal] forState:UIControlStateNormal];

//    [liveButton setImage:[UIImage imageNamed:imgHover] forState:UIControlStateHighlighted];

//    [liveButton setTitle:txtLabel forState:UIControlStateNormal];

//    //    [liveButton setImageEdgeInsets:UIEdgeInsetsMake(0, 50, 30, 50)];

//    //    [liveButton setTitleEdgeInsets:UIEdgeInsetsMake(30, -30, 0, 0)];

//    liveButton.imageView.backgroundColor = [UIColor redColor];

//    //    liveButton.titleLabel.frame = CGRectMake(liveButton.titleLabel.frame.origin.x, liveButton.titleLabel.frame.origin.y, btnLabelWidth, btnLabelHeight);

//    liveButton.titleLabel.backgroundColor = [UIColor blueColor];

//    [liveButton setTitleColor:[UIColor blackColor] forState: UIControlStateNormal];

//    [liveButton setTitleColor:[UIColor grayColor] forState: UIControlStateDisabled];

//    liveButton.titleLabel.font = labelFont;

//    liveButton.titleLabel.textAlignment = NSTextAlignmentCenter;

//    

//    int btnCenterX = btnWidth/2;

//    int btnImageCenterX = btnImageWidth/2;

//    

//    int offsetY = btnHeight - btnImageHeight;

//    

//    liveButton.imageEdgeInsets = UIEdgeInsetsMake(0,(btnCenterX - btnImageCenterX),offsetY,0);//设置imagebutton上的位置(上top,左left,下bottom,右right)这里可以写负值,对上写-5,那么image就象上移动5个像素

//    

//    

//    int btnLabelCenterX = btnImageWidth + btnLabelWidth/2;

//    liveButton.titleEdgeInsets = UIEdgeInsetsMake(btnImageHeight/2 + btnLabelHeight + btnSpacing, -(btnLabelCenterX - btnCenterX), 0, 0);//设置titlebutton上的位置(上top,左left,下bottom,右right

//    

//    

//    return liveButton;

//}


+ (DHUIImageButton*) createImageButton:(NSString*) title imgNormal:(NSString*)imgNormal imgHover:(NSString*)imgHover

{

    if (imgNormal == nil) {

        return nil;

    }

    NSString* txtLabel = title;


    UIFont* labelFont = [UIFont systemFontOfSize:[UIFont systemFontSize]];

    CGSize textLabelSize = [txtLabel sizeWithFont:labelFont];

    //    CGSize textLabelSize = [txtLabel sizeWithFont:[UIFont systemFontOfSize:17]];


    UIImage* img = [UIImage imageNamed: imgNormal];

    CGSize imgSize = [img size];

//    imgSize.width = imgSize.width/2;

//    imgSize.height = imgSize.height/2;


    DHUIImageButton* liveButton = [DHUIImageButton buttonWithType:UIButtonTypeCustom] ;

    int btnImageWidth = imgSize.width;

    int btnImageHeight = imgSize.height;

    int btnLabelWidth = textLabelSize.width;

    int btnLabelHeight = textLabelSize.height;

    int btnPaddingLeft = 0;

    int btnPaddingRight = 0;

    int btnPaddingTop = 0;

    int btnPaddingBottom = 0;

    int btnSpacing = 0;

    int btnWidth = MAX(btnImageWidth, btnLabelWidth) + btnPaddingLeft + btnPaddingRight;

    int btnHeight = btnImageHeight + btnSpacing + btnLabelHeight + btnPaddingTop + btnPaddingBottom;

    liveButton.frame = CGRectMake(0, 0, btnWidth, btnHeight);

    liveButton.backgroundColor = [UIColor greenColor];

    [liveButton setImage:[UIImage imageNamed:imgNormal] forState:UIControlStateNormal];

    [liveButton setImage:[UIImage imageNamed:imgHover] forState:UIControlStateHighlighted];

    [liveButton setTitle:txtLabel forState:UIControlStateNormal];

    //    [liveButton setImageEdgeInsets:UIEdgeInsetsMake(0, 50, 30, 50)];

    //    [liveButton setTitleEdgeInsets:UIEdgeInsetsMake(30, -30, 0, 0)];

    liveButton.imageView.backgroundColor = [UIColor redColor];

    //    liveButton.titleLabel.frame = CGRectMake(liveButton.titleLabel.frame.origin.x, liveButton.titleLabel.frame.origin.y, btnLabelWidth, btnLabelHeight);

    liveButton.titleLabel.backgroundColor = [UIColor blueColor];

    [liveButton setTitleColor:[UIColor blackColor] forState: UIControlStateNormal];

    [liveButton setTitleColor:[UIColor grayColor] forState: UIControlStateDisabled];

    liveButton.titleLabel.font = labelFont;

    liveButton.titleLabel.textAlignment = NSTextAlignmentCenter;


    int btnCenterX = btnWidth/2;

    int btnImageCenterX = btnImageWidth/2;


    int offsetY = btnHeight - btnImageHeight;


//    liveButton.imageEdgeInsets = UIEdgeInsetsMake(0,(btnCenterX - btnImageCenterX),offsetY,0);//设置imagebutton上的位置(上top,左left,下bottom,右right)这里可以写负值,对上写-5,那么image就象上移动5个像素



    int btnLabelCenterX = btnImageWidth + btnLabelWidth/2;

//    liveButton.titleEdgeInsets = UIEdgeInsetsMake(btnImageHeight/2 + btnLabelHeight + btnSpacing, -(btnLabelCenterX - btnCenterX), 0, 0);//设置titlebutton上的位置(上top,左left,下bottom,右right



    return liveButton;

}


-(void)layoutSubviews {

    [super layoutSubviews];

    

    // Center image

    CGPoint center = self.imageView.center;

    center.x = self.frame.size.width/2;

    center.y = self.imageView.frame.size.height/2;

    self.imageView.center = center;

    

    //Center text

    CGRect newFrame = [self titleLabel].frame;

    newFrame.origin.x = 0;

    newFrame.origin.y = self.imageView.frame.size.height + 5;

    newFrame.size.width = self.frame.size.width;

    

    self.titleLabel.frame = newFrame;

    self.titleLabel.textAlignment = UITextAlignmentCenter;

}


/*

// Only override drawRect: if you perform custom drawing.

// An empty implementation adversely affects performance during animation.

- (void)drawRect:(CGRect)rect {

    // Drawing code

}

*/


@end



你可能感兴趣的:(iOS,Dev)