ios项目拆分之一 —— 扩充UIButton布局

参加比赛的项目,从团队组建到至今,一直一个人负责ios平台的app开发,开发周期断断续续一个月,主体功能一周完成,那一周真是酸爽,一天24h除了睡觉就是在敲键盘,好在结果还不错,有了回报。快速开发过去近一个月,吸收的东西太多,没有好好整理,慢慢写吧,其中用到了好多第三方sdk,主要功能包括人机互动,天气预报(只显示在UI上),拍照识别,地图导航,音乐播放,电台播放等,涉及到的接口非常之多,蓝牙也是后期的拓展功能。

  • 需要实现UIButton的 Image 和 文字 之间的排版模式(图上字下、图左字右、图下字上、图右字左)

思路:可以在UIButton上写一个UIImageView和UILabel,也可以把增加自身UIButton的方法,这样整个工程中需要拍版图片和文字的Button都能用到,简便了代码。


这里用到了Category模式,它主要用于向已经存在的类添加方法来扩展已有类的目的,在很多情形下Category也是比创建子类更优的选择。新添加的方法同样也会被被扩展的类的所有子类自动继承。

注释都在代码里

.h文件中枚举4种拍版样式和一个扩充的方法,如下代码:

typedef NS_ENUM(NSUInteger, ZZButtonEdgeInsetsStyle) 
{
    ZZButtonEdgeInsetsStyleTop, // image上,label下
    ZZButtonEdgeInsetsStyleLeft, // image左,label右
    ZZButtonEdgeInsetsStyleBottom, // image下,label上
    ZZButtonEdgeInsetsStyleRight // image右,label左
};

- (void)layoutButtonWithEdgeInsetsStyle:(ZZButtonEdgeInsetsStyle)style imageTitleSpace:(CGFloat)space;

.m中实现这个方法如下:

- (void)layoutButtonWithEdgeInsetsStyle:(ZZButtonEdgeInsetsStyle)style imageTitleSpace:(CGFloat)space
{    
    /**
     *  前置知识点:titleEdgeInsets是title相对于其上下左右的inset,跟tableView的contentInset是类似的
     *  如果只有title,那它上下左右都是相对于button的,image也是一样
     *  如果同时有image和label,那这时候image的上左下是相对于button,右边是相对于label的;title的上右下是相对于button,左边是相对于image的。
     */

    // 1.得到imageView和titleLabel的宽、高
    CGFloat imageWith = self.imageView.frame.size.width;
    CGFloat imageHeight = self.imageView.frame.size.height;
    
    CGFloat labelWidth = 0.0;
    CGFloat labelHeight = 0.0;
    
    if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
        // 由于iOS8中titleLabel的size为0,用下面的这种设置
        labelWidth = self.titleLabel.intrinsicContentSize.width;
        labelHeight = self.titleLabel.intrinsicContentSize.height;
        
    } else {
        labelWidth = self.titleLabel.frame.size.width;
        labelHeight = self.titleLabel.frame.size.height;
        
    }
    
    // 2. 声明全局的imageEdgeInsets和labelEdgeInsets
    UIEdgeInsets imageEdgeInsets = UIEdgeInsetsZero;
    UIEdgeInsets labelEdgeInsets = UIEdgeInsetsZero;
    
    // 3. 根据style和space得到imageEdgeInsets和labelEdgeInsets的值
    switch (style) {
        case ZZButtonEdgeInsetsStyleTop:
        {
           imageEdgeInsets = UIEdgeInsetsMake(-labelHeight-space/2.0, 0, 0, -labelWidth);
           labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith, -imageHeight-space/2.0, 0);
            
        }
            break;
        case ZZButtonEdgeInsetsStyleLeft:
        {
            imageEdgeInsets = UIEdgeInsetsMake(0, -space/2.0, 0, space/2.0);
            labelEdgeInsets = UIEdgeInsetsMake(0, space/2.0, 0, -space/2.0);
        }
            break;
        case ZZButtonEdgeInsetsStyleBottom:
        {
            imageEdgeInsets = UIEdgeInsetsMake(0, 0, -labelHeight-space/2.0, -labelWidth);
            labelEdgeInsets = UIEdgeInsetsMake(-imageHeight-space/2.0, -imageWith, 0, 0);
        }
            break;
        case ZZButtonEdgeInsetsStyleRight:
        {
            imageEdgeInsets = UIEdgeInsetsMake(0, labelWidth+space/2.0, 0, -labelWidth-space/2.0);
            labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith-space/2.0, 0, imageWith+space/2.0);
        }
            break;
        default:
            break;
    }
    
    // 4. 赋值
    self.titleEdgeInsets = labelEdgeInsets;
    self.imageEdgeInsets = imageEdgeInsets;
}

在工程中可以直接拿来用,例如:

// 这里的setting设置的是局部变量
setting = [[UIButton alloc] initWithFrame:CGRectMake(0, 40, 80, 80)];
[setting setImage:[UIImage imageNamed:@"setting"] forState:UIControlStateNormal];
[setting setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[setting setTitle:@"设置" forState:UIControlStateNormal]; /**以上是button的设置*/ 
    
CGFloat space = 20.0;  // space是图和文字的上下间距
[setting layoutButtonWithEdgeInsetsStyle:ZZButtonEdgeInsetsStyleTop imageTitleSpace:space];
[self.view addSubview:setting];
	// 别的排版就不举例了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值