美文网首页
iOS Button内的图片和文字的自由排列

iOS Button内的图片和文字的自由排列

作者: CodeGeass | 来源:发表于2017-11-28 10:30 被阅读21次

    转自:https://github.com/Phelthas/Demo_ButtonImageTitleEdgeInsets

    #import <UIKit/UIKit.h>
    
    typedef NS_ENUM(NSInteger, LXMImagePosition) {
        LXMImagePositionLeft = 0,              //图片在左,文字在右,默认
        LXMImagePositionRight = 1,             //图片在右,文字在左
        LXMImagePositionTop = 2,               //图片在上,文字在下
        LXMImagePositionBottom = 3,            //图片在下,文字在上
    };
    
    @interface UIButton (LXMImagePosition)
    
    /**
     *  利用UIButton的titleEdgeInsets和imageEdgeInsets来实现文字和图片的自由排列
     *  注意:这个方法需要在设置图片和文字之后才可以调用,且button的大小要大于 图片大小+文字大小+spacing
     *
     *  @param spacing 图片和文字的间隔
     */
    - (void)setImagePosition:(LXMImagePosition)postion spacing:(CGFloat)spacing;
    
    @end
    
    @implementation UIButton (LXMImagePosition)
    
    - (void)setImagePosition:(LXMImagePosition)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
        
        // gzd 修改 16.9.28
        CGSize  labelSize   = CGSizeZero;
        CGFloat labelWidth  = 0;
        CGFloat labelHeight = 0;
        if ([self.titleLabel.text respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) {
            labelSize = [self.titleLabel.text boundingRectWithSize:self.bounds.size options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:self.titleLabel.font} context:nil].size;
        }else {
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wdeprecated-declarations"
            labelSize = [self.titleLabel.text sizeWithFont:self.titleLabel.font];
    #pragma clang diagnostic pop
        }
        labelWidth = labelSize.width;
        labelHeight = labelSize.height;
        //----------------
        
        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 LXMImagePositionLeft:
                self.imageEdgeInsets = UIEdgeInsetsMake(0, -spacing/2, 0, spacing/2);
                self.titleEdgeInsets = UIEdgeInsetsMake(0, spacing/2, 0, -spacing/2);
                break;
                
            case LXMImagePositionRight:
                self.imageEdgeInsets = UIEdgeInsetsMake(0, labelWidth + spacing/2, 0, -(labelWidth + spacing/2));
                self.titleEdgeInsets = UIEdgeInsetsMake(0, -(imageHeight + spacing/2), 0, imageHeight + spacing/2);
                break;
                
            case LXMImagePositionTop:
                self.imageEdgeInsets = UIEdgeInsetsMake(-imageOffsetY, imageOffsetX, imageOffsetY, -imageOffsetX);
                self.titleEdgeInsets = UIEdgeInsetsMake(labelOffsetY, -labelOffsetX, -labelOffsetY, labelOffsetX);
                break;
                
            case LXMImagePositionBottom:
                self.imageEdgeInsets = UIEdgeInsetsMake(imageOffsetY, imageOffsetX, -imageOffsetY, -imageOffsetX);
                self.titleEdgeInsets = UIEdgeInsetsMake(-labelOffsetY, -labelOffsetX, labelOffsetY, labelOffsetX);
                break;
                
            default:
                break;
        }
    }
    
    @end
    

    相关文章

      网友评论

          本文标题:iOS Button内的图片和文字的自由排列

          本文链接:https://www.haomeiwen.com/subject/hmjsbxtx.html