zoukankan      html  css  js  c++  java
  • UIButton图片文字位置的四种情况

    我们在做项目的过程中经常会遇到各定制UIButton

    1.左边图片,右边文字

    2.左边文字,右边图片

    3.上边图片,下边文字

    4.上边文字,下边图片

    针对这四种情况

    使用UIButton的category实现

    .h文件实现内容

    #import <UIKit/UIKit.h>
    
    typedef NS_ENUM(NSInteger,SDButtonStyle) {
        SDButtonStyleNormal = 0,
        SDButtonStyleTitleLeft,
        SDButtonStyleTitleUp,
        SDButtonStyleTitleDown
    };
    @interface UIButton (ButtonStyle)
    
    @property (nonatomic, assign) CGRect imageRect;
    @property (nonatomic, assign) CGRect titleRect;
    @property (nonatomic, assign) SDButtonStyle buttonStyle;
    @property (nonatomic, assign) CGFloat verSpace;
    @end
    

      .m文件实现内容

    #import "UIButton+ButtonStyle.h"
    #import <objc/runtime.h>
    
    @implementation UIButton (ButtonStyle)
    
    + (void)load {
        Method imageOriginalMethod = class_getInstanceMethod([self class], @selector(imageRectForContentRect:));
        Method imageSwizzledMethod = class_getInstanceMethod([self class], @selector(sd_imageRectForContentRect:));
        method_exchangeImplementations(imageOriginalMethod, imageSwizzledMethod);
        
        Method titleOriginalMethod = class_getInstanceMethod([self class], @selector(titleRectForContentRect:));
        Method titleSwizzledMethod = class_getInstanceMethod([self class], @selector(sd_titleRectForContentRect:));
        method_exchangeImplementations(titleOriginalMethod, titleSwizzledMethod);
    }
    
    - (CGRect)sd_imageRectForContentRect:(CGRect)contentRect {
        if (!CGRectIsEmpty(self.imageRect) && !CGRectEqualToRect(self.imageRect, CGRectZero)) {
            return self.imageRect;
        }
        
        CGRect imgRect = [self sd_imageRectForContentRect:contentRect];
        CGRect titRect = [self sd_titleRectForContentRect:contentRect];
        if (self.buttonStyle == SDButtonStyleTitleLeft) {
            imgRect.origin.x = CGRectGetMaxX(titRect) - CGRectGetWidth(imgRect);
            return imgRect;
        }
        if (self.buttonStyle == SDButtonStyleTitleDown) {
            imgRect.origin.x = (CGRectGetWidth(contentRect) - CGRectGetWidth(imgRect))/2.f;
            imgRect.origin.y = ceilf((CGRectGetHeight(contentRect) - CGRectGetHeight(titRect) - CGRectGetHeight(imgRect))) /2.f;
            return imgRect;
        }
        if (self.buttonStyle == SDButtonStyleTitleUp) {
            imgRect.origin.x = (CGRectGetWidth(contentRect) - CGRectGetWidth(imgRect))/2.f;
            imgRect.origin.y = (CGRectGetHeight(contentRect) + CGRectGetHeight(titRect) - CGRectGetHeight(imgRect) + self.verSpace)/2.f;
            return imgRect;
        }
        return imgRect;
    }
    
    - (CGRect)sd_titleRectForContentRect:(CGRect)contentRect {
        if (!CGRectIsEmpty(self.titleRect) && !CGRectEqualToRect(self.titleRect, CGRectZero)) {
            return self.titleRect;
        }
    
        CGRect imgRect = [self sd_imageRectForContentRect:contentRect];
        CGRect titRect = CGRectZero;
        if (self.buttonStyle == SDButtonStyleTitleLeft) {
            titRect = [self sd_titleRectForContentRect:contentRect];
            titRect.origin.x = CGRectGetMinX(imgRect) - self.verSpace;
            return titRect;
        }
        
        CGFloat height = CGRectGetHeight(contentRect);
        CGFloat width  = CGRectGetWidth(contentRect);
        
        if (self.buttonStyle == SDButtonStyleTitleDown) {
            titRect = [self sd_titleRectForContentRect:CGRectMake(0, 0, 3 * width, height)];
            titRect.origin.x = ceilf((width - CGRectGetWidth(titRect))/2.f);
            titRect.origin.y = ceilf((height - CGRectGetHeight(titRect) + CGRectGetHeight(imgRect))/2.f + self.verSpace);
            return titRect;
        }
        if (self.buttonStyle == SDButtonStyleTitleUp) {
            titRect = [self sd_titleRectForContentRect:CGRectMake(0, 0, 3 * width, height)];
            titRect.origin.x = ceilf((width - CGRectGetWidth(titRect))/2.f);
            titRect.origin.y = ceilf((height - CGRectGetHeight(titRect) - CGRectGetHeight(imgRect) - self.verSpace ) /2.f);
            return titRect;
        }
        return [self sd_titleRectForContentRect:contentRect];
    }
    
    #pragma mark --- AssociatedObject
    
    - (void)setImageRect:(CGRect)imageRect {
        NSValue *value = [NSValue valueWithCGRect:imageRect];
        objc_setAssociatedObject(self, @selector(imageRect), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (CGRect)imageRect {
        NSValue *value = objc_getAssociatedObject(self, @selector(imageRect));
        return [value CGRectValue];
    }
    
    - (void)setTitleRect:(CGRect)titleRect {
        NSValue *value = [NSValue valueWithCGRect:titleRect];
        objc_setAssociatedObject(self, @selector(titleRect), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (CGRect)titleRect {
        NSValue *value = objc_getAssociatedObject(self, @selector(titleRect));
        return [value CGRectValue];
    }
    
    - (CGFloat)verSpace {
        NSNumber *value = objc_getAssociatedObject(self, @selector(verSpace));
        return [value floatValue];
    }
    
    - (void)setVerSpace:(CGFloat)verSpace {
        NSNumber *value = [NSNumber numberWithFloat:verSpace];
        objc_setAssociatedObject(self, @selector(verSpace), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (void)setButtonStyle:(SDButtonStyle)buttonStyle {
        objc_setAssociatedObject(self, @selector(buttonStyle), @(buttonStyle), OBJC_ASSOCIATION_ASSIGN);
    }
    
    - (SDButtonStyle)buttonStyle {
        return [objc_getAssociatedObject(self, @selector(buttonStyle)) integerValue];
    }
    
    @end
    

      

  • 相关阅读:
    Codeforces 429 A. Xor-tree
    有趣的游戏:Google XSS Game
    三层架构(一个)——什么是三层架构?
    atitit.ajax bp dwr 3.该票据安排使用的流量汇总 VO9o.....
    深入struts2.0(五)--Dispatcher类
    update与fixedupdate差别
    Android 平台 HTTP网速測试 案例 API 分析
    Matlab画图-非常具体,非常全面
    词性标注
    windows消息钩子
  • 原文地址:https://www.cnblogs.com/likun123/p/9518608.html
Copyright © 2011-2022 走看看