• 按钮图片文字随意摆放


    日常开发中我门都会遇到图片和文字在一个区域,这样的话系统的按钮就满足不了我们需求,下面先看图:

    上代码:

    /*
     *按钮图片和文字一体随意摆放.
     */
    
    #import <UIKit/UIKit.h>
    
    @interface XMButton : UIButton
    
    @property (nonatomic,assign)CGRect titleRect;
    @property (nonatomic,assign)CGRect imageRect;
    
    
    @end
    
    
    #import "XMButton.h"
    
    @implementation XMButton
    
    
    - (instancetype)initWithFrame:(CGRect)frame
    {
        if (self = [super initWithFrame:frame]) {
            
            self.titleLabel.font = [UIFont systemFontOfSize:13];
        }
        
        return self;
    }
    
    - (CGRect)titleRectForContentRect:(CGRect)contentRect
    {
        if (!CGRectIsEmpty(self.titleRect)&&!CGRectEqualToRect(self.titleRect, CGRectZero)) {
            
            return self.titleRect;
        }
        
        return [super titleRectForContentRect:contentRect];
    }
    
    - (CGRect)imageRectForContentRect:(CGRect)contentRect
    {
        if (!CGRectIsEmpty(self.imageRect)&&!CGRectEqualToRect(self.imageRect, CGRectZero)) {
            
            return self.imageRect;
        }
        
        return [super imageRectForContentRect:contentRect];
    }
    @end

    调用:

     //图上文下
        XMButton *wxButton = [XMButton buttonWithType:UIButtonTypeCustom];
        [wxButton setTitle:@"我是微信" forState:UIControlStateNormal];
        [wxButton setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
        [wxButton setTitleColor:[UIColor yellowColor] forState:UIControlStateHighlighted];
        [wxButton setBackgroundColor:[UIColor greenColor]];
        [wxButton setImage:[UIImage imageNamed:@"weixinfenxiang"] forState:UIControlStateNormal];
        wxButton.frame = CGRectMake(20, 70, 80, 80);
        wxButton.imageRect = CGRectMake(10, 5, wxButton.bounds.size.width-20, wxButton.bounds.size.height-25);
        wxButton.titleRect = CGRectMake(CGRectGetMinX(wxButton.imageRect), CGRectGetMaxY(wxButton.imageRect), CGRectGetWidth(wxButton.imageRect), 20);
        wxButton.titleLabel.textAlignment = NSTextAlignmentCenter;
        [self.view addSubview:wxButton];
        
        
        //图下文上
        XMButton *qqButton = [XMButton buttonWithType:UIButtonTypeCustom];
        [qqButton setTitle:@"我是企鹅" forState:UIControlStateNormal];
        [qqButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
        [qqButton setTitleColor:[UIColor orangeColor] forState:UIControlStateHighlighted];
        qqButton.backgroundColor = [UIColor greenColor];
        [qqButton setImage:[UIImage imageNamed:@"qqfenxiang"] forState:UIControlStateNormal];
        qqButton.frame = CGRectMake(20, 200, 80, 80);
        qqButton.titleRect = CGRectMake(10,5, qqButton.bounds.size.width-20, 20);
        qqButton.imageRect = CGRectMake(10, CGRectGetMaxY(qqButton.titleRect), CGRectGetWidth(qqButton.titleRect),CGRectGetHeight(qqButton.frame)-30);
        qqButton.titleLabel.textAlignment = NSTextAlignmentCenter;
        [self.view addSubview:qqButton];
        
        //图右文左
        XMButton *wbButton = [XMButton buttonWithType:UIButtonTypeCustom];
        [wbButton setTitle:@"我是微博" forState:UIControlStateNormal];
        [wbButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
        [wbButton setTitleColor:[UIColor orangeColor] forState:UIControlStateHighlighted];
        wbButton.backgroundColor = [UIColor greenColor];
        [wbButton setImage:[UIImage imageNamed:@"weibofenxiang"] forState:UIControlStateNormal];
        wbButton.frame = CGRectMake(20, 300, 130, 60);
        wbButton.titleRect = CGRectMake(10, wbButton.bounds.size.height/2-20/2, 60, 20);
        wbButton.imageRect = CGRectMake(CGRectGetMaxX(wbButton.titleRect), 5, wbButton.bounds.size.width-wbButton.titleRect.size.width-20, wbButton.bounds.size.height-10);
        wbButton.titleLabel.textAlignment = NSTextAlignmentCenter;
        [self.view addSubview:wbButton];
        
        
        //系统默认(图左文右)
        XMButton *pyButton = [XMButton buttonWithType:UIButtonTypeCustom];
        [pyButton setTitle:@"我是朋友圈" forState:UIControlStateNormal];
        [pyButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
        [pyButton setTitleColor:[UIColor orangeColor] forState:UIControlStateHighlighted];
        pyButton.backgroundColor = [UIColor greenColor];
        [pyButton setImage:[UIImage imageNamed:@"pengyouquanfenxiang"] forState:UIControlStateNormal];
        pyButton.frame = CGRectMake(20, 400, 130, 60);
        [self.view addSubview:pyButton];

    2.另外一种方式:

    #import <UIKit/UIKit.h>
    
    typedef NS_ENUM(NSInteger, CDMImagePosition) {
        CDMImagePositionLeft = 0,              //图片在左,文字在右,默认
        CDMImagePositionRight = 1,             //图片在右,文字在左
        CDMImagePositionTop = 2,               //图片在上,文字在下
        CDMImagePositionBottom = 3,            //图片在下,文字在上
    };
    
    @interface UIButton (CDMImagePosition)
    
    /**
     *  利用UIButton的titleEdgeInsets和imageEdgeInsets来实现文字和图片的自由排列
     *  注意:这个方法需要在设置图片和文字之后才可以调用,且button的大小要大于 图片大小+文字大小+spacing
     *
     *  @param spacing 图片和文字的间隔
     */
    - (void)setImagePosition:(CDMImagePosition)postion spacing:(CGFloat)spacing;
    
    @end
    #import "UIButton+CDMImagePosition.h"
    
    @implementation UIButton (CDMImagePosition)
    
    - (void)setImagePosition:(CDMImagePosition)postion spacing:(CGFloat)spacing {
        CGFloat imageWith = self.imageView.image.size.width;
        CGFloat imageHeight = self.imageView.image.size.height;
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wdeprecated-declarations"
        CGFloat labelWidth = [self.titleLabel.text sizeWithFont:self.titleLabel.font].width;
        CGFloat labelHeight = [self.titleLabel.text sizeWithFont:self.titleLabel.font].height;
    #pragma clang diagnostic pop
        
        CGFloat imageOffsetX = (imageWith + labelWidth) / 2 - imageWith / 2;//image中心移动的x距离
        CGFloat imageOffsetY = imageHeight / 2 + spacing / 2;//image中心移动的y距离
        CGFloat labelOffsetX = (imageWith + labelWidth / 2) - (imageWith + labelWidth) / 2;//label中心移动的x距离
        CGFloat labelOffsetY = labelHeight / 2 + spacing / 2;//label中心移动的y距离
        
        switch (postion) {
            case CDMImagePositionLeft:
                self.imageEdgeInsets = UIEdgeInsetsMake(0, -spacing/2, 0, spacing/2);
                self.titleEdgeInsets = UIEdgeInsetsMake(0, spacing/2, 0, -spacing/2);
                break;
                
            case CDMImagePositionRight:
                self.imageEdgeInsets = UIEdgeInsetsMake(0, labelWidth + spacing/2, 0, -(labelWidth + spacing/2));
                self.titleEdgeInsets = UIEdgeInsetsMake(0, -(imageHeight + spacing/2), 0, imageHeight + spacing/2);
                break;
                
            case CDMImagePositionTop:
                self.imageEdgeInsets = UIEdgeInsetsMake(-imageOffsetY, imageOffsetX, imageOffsetY, -imageOffsetX);
                self.titleEdgeInsets = UIEdgeInsetsMake(labelOffsetY, -labelOffsetX, -labelOffsetY, labelOffsetX);
                break;
                
            case CDMImagePositionBottom:
                self.imageEdgeInsets = UIEdgeInsetsMake(imageOffsetY, imageOffsetX, -imageOffsetY, -imageOffsetX);
                self.titleEdgeInsets = UIEdgeInsetsMake(-labelOffsetY, -labelOffsetX, labelOffsetY, labelOffsetX);
                break;
                
            default:
                break;
        }
        
    }

    还有一种利用分类+runtime 的形式,留给大家写吧,Demo 就不上了,代码都在上面了.

  • 相关阅读:
    ajax如何调用本页数据源不用一般处理程序
    管理员IP匹配方法
    Silverlight DataGrid赋数据源自动生成列表
    Winform WebBrowser加上进度条
    asp.net的几个帮助类
    asp.net App.config配置文件帮助类
    查找集合中某个元素的位置和某个元素的集合
    sqlServer通用分页
    定时执行某个方法
    关于IE6.7.8.FF兼容的问题
  • 原文地址:https://www.cnblogs.com/dianming/p/6627662.html
Copyright © 2020-2023  润新知