如何实现按钮的图片在右边,文字在左边

简介: 如何实现按钮的图片在右边,文字在左边

按钮设置了文字和图片,若宽度足够展开的话,默认都是图片在作,文字在右。想文字在左,图片在右有三种方法。

第一种方法很简单。通过设置setSemanticContentAttribute属性来实现。

       _bgBtn2 = [[UIButton alloc] init];
        [_bgBtn2 setBackgroundColor:[UIColor clearColor]];
        [_bgBtn2 setTitle:@"关注问题(243)" forState:UIControlStateNormal];
        [_bgBtn2.titleLabel setFont:[UIFont systemFontOfSize:12]];
        [_bgBtn2 setTitleColor:DYHighlightColor forState:UIControlStateNormal];
        [_bgBtn2 setImage:[UIImage imageNamed:@"icon_quest31"] forState:UIControlStateNormal];
**[_bgBtn2 setSemanticContentAttribute:UISemanticContentAttributeForceRightToLeft];**

第二种方法是通过设置titleEdgeInsets和setImageEdgeInsets来实现。

        _selectBtn = [[BGSwapButton alloc] initWithTitle:@"排序" titleColor:DEFAULT_TITLE_LIGHT_FRONT_COLOR selectedTitleColor:DYHighlightColor icon:[UIImage imageNamed:@"icon_quest32"] selectedIcon:[UIImage imageNamed:@"icon_quest_sort"] frame:CGRectMake(FULL_WIDTH-40-COMMON_EDGE_DISTANCE, 12+100+12+28+12+8+(45-12.0)/2, 40, 12)];
        _selectBtn.titleLabel.font = BGFont(12);
        **_selectBtn.titleEdgeInsets=UIEdgeInsetsMake(0, -(40 -9)+8,0, 0);//上左下右
        [_selectBtn setImageEdgeInsets:UIEdgeInsetsMake(0, 40-9, 0, 0)];//上左下右**

第三种方法是通过一个按钮分类,设置方法来实现,使用也很简单。

            UIButton *btn = [UIButton buttonWithTitle:@"收藏" font:SystemFontOfSize(13) color:TextBlackColor];
            [btn setTitle:@"已收藏" forState:UIControlStateSelected];
            [btn setTitleColor:MainAPPColor forState:UIControlStateSelected];
            [btn setImage:[UIImage imageNamed:@"icon_collect_no"] forState:UIControlStateNormal];
            [btn setImage:[UIImage imageNamed:@"icon_collect_yes"] forState:UIControlStateSelected];
            [btn addTarget:self action:@selector(collectAction:) forControlEvents:UIControlEventTouchUpInside];
            [btn layoutButtonWithEdgeInsetsStyle:JKButtonEdgeInsetsStyleRight imageTitleSpace:5];

UIButton+Commemt.h文件:

#import <UIKit/UIKit.h>

// 定义一个枚举(包含了四种类型的button)
typedef NS_ENUM(NSUInteger, JKButtonEdgeInsetsStyle) {
    JKButtonEdgeInsetsStyleTop, // image在上,label在下
    JKButtonEdgeInsetsStyleLeft, // image在左,label在右
    JKButtonEdgeInsetsStyleBottom, // image在下,label在上
    JKButtonEdgeInsetsStyleRight // image在右,label在左
};


NS_ASSUME_NONNULL_BEGIN

@interface UIButton (Commemt)

/// 标题
@property (nonatomic,copy)NSString *jk_title;
/// 选中的标题
@property (nonatomic,copy)NSString *jk_selectedTitle;
/// 标题颜色
@property (nonatomic,strong)UIColor *jk_titleColor;
/// 选中的标题颜色
@property (nonatomic,strong)UIColor *jk_selectedTitleColor;

//
@property (nonatomic,strong)UIColor *jk_HighlightedTitleColor;

//普通的背景图片
@property (nonatomic,strong)UIImage *jk_normalImage;
//选中的背景图片
@property (nonatomic,strong)UIImage *jk_selectedImage;
//增加点击的区域
@property(nonatomic, assign) UIEdgeInsets jk_hitTestEdgeInsets;

//设置背景颜色
- (void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state;
//按钮的的样式和间隔
/**
 *  设置button的titleLabel和imageView的布局样式,及间距
 *
 *  @param style titleLabel和imageView的布局样式
 *  @param space titleLabel和imageView的间距
 */
- (void)layoutButtonWithEdgeInsetsStyle:(JKButtonEdgeInsetsStyle)style
                        imageTitleSpace:(CGFloat)space;


@end

NS_ASSUME_NONNULL_END

UIButton+Commemt.m文件:


#import "UIButton+Commemt.h"
#import "objc/runtime.h"

@implementation UIButton (Commemt)

@dynamic jk_hitTestEdgeInsets;
static const NSString *KEY_HIT_TEST_EDGE_INSETS =  @"HitTestEdgeInsets";

- (void)setJk_hitTestEdgeInsets:(UIEdgeInsets)jk_hitTestEdgeInsets {
    NSValue *value = [NSValue value:&jk_hitTestEdgeInsets withObjCType:@encode(UIEdgeInsets)];
    objc_setAssociatedObject(self, &KEY_HIT_TEST_EDGE_INSETS, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}


- (UIEdgeInsets)jk_hitTestEdgeInsets {
    NSValue *value = objc_getAssociatedObject(self, &KEY_HIT_TEST_EDGE_INSETS);
    if(value) {
        UIEdgeInsets edgeInsets;
        [value getValue:&edgeInsets];
        return edgeInsets;
    }else {
        return UIEdgeInsetsZero;
    }
}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    if(UIEdgeInsetsEqualToEdgeInsets(self.jk_hitTestEdgeInsets, UIEdgeInsetsZero) ||       !self.enabled || self.hidden) {
        return [super pointInside:point withEvent:event];
}
    CGRect relativeFrame = self.bounds;
    CGRect hitFrame = UIEdgeInsetsInsetRect(relativeFrame, self.jk_hitTestEdgeInsets);
    return CGRectContainsPoint(hitFrame, point);
}

//image

- (void)setJk_normalImage:(UIImage *)jk_normalImage {
    objc_setAssociatedObject(self, @selector(jk_normalImage), jk_normalImage, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    [self setImage:jk_normalImage forState:UIControlStateNormal];
}

- (UIImage *)jk_normalImage {
    return objc_getAssociatedObject(self, @selector(jk_normalImage));
}

- (void)setJk_selectedImage:(UIImage *)jk_selectedImage {
    objc_setAssociatedObject(self, @selector(jk_selectedImage), jk_selectedImage, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    [self setImage:jk_selectedImage forState:UIControlStateSelected];
}

- (UIImage *)jk_selectedImage {
    return objc_getAssociatedObject(self, @selector(jk_selectedImage));
}

/

- (void)setJk_title:(NSString *)jk_title {
    objc_setAssociatedObject(self, @selector(jk_title), jk_title, OBJC_ASSOCIATION_COPY_NONATOMIC);
    [self setTitle:jk_title forState:UIControlStateNormal];
}

- (NSString *)jk_title {
    return objc_getAssociatedObject(self, @selector(jk_title));
}

//
- (void)setJk_selectedTitle:(NSString *)jk_selectedTitle {
    objc_setAssociatedObject(self, @selector(jk_selectedTitle), jk_selectedTitle, OBJC_ASSOCIATION_COPY_NONATOMIC);
    [self setTitle:jk_selectedTitle forState:UIControlStateSelected];
}

- (NSString *)jk_selectedTitle {
    return objc_getAssociatedObject(self, @selector(jk_selectedTitle));
}

//

- (UIColor *)jk_titleColor {
    return objc_getAssociatedObject(self, @selector(jk_titleColor));
}

- (void)setJk_titleColor:(UIColor *)jk_titleColor {
    objc_setAssociatedObject(self, @selector(jk_titleColor), jk_titleColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    [self setTitleColor:jk_titleColor forState:UIControlStateNormal];
}

- (UIColor *)jk_selectedTitleColor {
    return objc_getAssociatedObject(self, @selector(jk_selectedTitleColor));
}

- (void)setJk_selectedTitleColor:(UIColor *)jk_selectedTitleColor {
    objc_setAssociatedObject(self, @selector(jk_selectedTitleColor), jk_selectedTitleColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    [self setTitleColor:jk_selectedTitleColor forState:UIControlStateSelected];
}

///
- (void)setJk_HighlightedTitleColor:(UIColor *)jk_HighlightedTitleColor {
    objc_setAssociatedObject(self, @selector(jk_HighlightedTitleColor), jk_HighlightedTitleColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    [self setTitleColor:jk_HighlightedTitleColor forState:UIControlStateHighlighted];
}

- (UIColor *)jk_HighlightedTitleColor {
    return objc_getAssociatedObject(self, @selector(jk_HighlightedTitleColor));
}

//
- (void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state {
    [self setBackgroundImage:[UIButton imageWithColor:backgroundColor] forState:state];
}

+ (UIImage *)imageWithColor:(UIColor *)color {
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

//按钮样式

- (void)layoutButtonWithEdgeInsetsStyle:(JKButtonEdgeInsetsStyle)style imageTitleSpace:(CGFloat)space {
    // 1. 得到imageView和titleLabel的宽、高
    CGFloat imageWith = self.imageView.intrinsicContentSize.width;
    if((imageWith != ((NSInteger)imageWith)) && (((NSInteger)(imageWith+0.5)) != ((NSInteger)(imageWith))))
    {
        imageWith = imageWith + 0.5;
    }
    CGFloat imageHeight = self.imageView.intrinsicContentSize.height;

    CGFloat labelWidth = self.titleLabel.intrinsicContentSize.width;
    if((labelWidth != ((NSInteger)labelWidth)) && (((NSInteger)(labelWidth+0.5)) != ((NSInteger)(labelWidth))))
    {
        labelWidth = labelWidth + 0.5;
    }
    CGFloat labelHeight = self.titleLabel.intrinsicContentSize.height;

    // 2. 声明全局的imageEdgeInsets和labelEdgeInsets
    UIEdgeInsets imageEdgeInsets = UIEdgeInsetsZero;
    UIEdgeInsets labelEdgeInsets = UIEdgeInsetsZero;

    // 上左下右
    switch (style) {
        case JKButtonEdgeInsetsStyleTop: {
            imageEdgeInsets = UIEdgeInsetsMake(-labelHeight - space / 2.0, 0, 0, -labelWidth);
            labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith, -imageHeight - space / 2.0, 0);
        }
        break;
        case JKButtonEdgeInsetsStyleLeft: {
            imageEdgeInsets = UIEdgeInsetsMake(0, -space / 2.0, 0, space / 2.0);
            labelEdgeInsets = UIEdgeInsetsMake(0, space / 2.0, 0, -space / 2.0);
        }
        break;
        case JKButtonEdgeInsetsStyleRight: {
            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;
        case JKButtonEdgeInsetsStyleBottom: {
            imageEdgeInsets = UIEdgeInsetsMake(0, 0, -labelHeight - space / 2.0, -labelWidth);
            labelEdgeInsets = UIEdgeInsetsMake(-imageHeight - space / 2.0, -imageWith, 0, 0);
        }
        break;

        default:
            break;
    }

    // 4. 赋值
    self.titleEdgeInsets = labelEdgeInsets;
    self.imageEdgeInsets = imageEdgeInsets;
}

@end

但是这些方法能解决99%的手机图文按钮适配,但是我遇到一个特定的手机(iOS13.6.1 XR手就),以上第一种方法和第三种方法都解决不了,第二种方法没有尝试(由于这需要计算按钮的边距通用性很差)。所以不考虑那个特殊手机的情况,建议采用第一种方法和第三种方法。若遇到测试用这个特定手机只能使用《iOS13.6.1系统XR手机图文按钮显示不全问题》。

目录
相关文章
|
安全 C++
【C++11保姆级教程】移动构造函数(move constructor)和移动赋值操作符(move assignment operator)
【C++11保姆级教程】移动构造函数(move constructor)和移动赋值操作符(move assignment operator)
1501 0
|
缓存
Autojs4.1.0实战教程---快手极速版清理缓存
Autojs4.1.0实战教程---快手极速版清理缓存
563 1
|
Web App开发 前端开发 Android开发
iOS 唤起 APP: Universal Link(通用链接)(下)
iOS 唤起 APP: Universal Link(通用链接)(下)
1701 0
iOS 唤起 APP: Universal Link(通用链接)(下)
|
Python
Python 解析 yaml 配置文件
Python 解析 yaml 配置文件
250 0
|
Perl
pod spec lint编译时报error: include of non-modular header inside framework module
pod spec lint编译时报error: include of non-modular header inside framework module
319 1
|
前端开发 C#
wpfui:一个开源免费具有现代化设计趋势的WPF控件库
wpfui:一个开源免费具有现代化设计趋势的WPF控件库
471 0
|
运维 安全 数据安全/隐私保护
openstack keystone运维基础命令
在OpenStack中,Keystone作为身份服务模块,负责用户认证、令牌管理、服务目录和基于角色的访问控制。通过设置环境变量进行授权,然后执行如创建用户alice并设置密码,修改密码,列出用户,显示用户详情等操作。此外,还涉及到创建项目yun2024,查看和删除项目,创建及分配角色yunjisuanmy给用户alice,以及列出和删除角色。最后展示了查询OpenStack端点地址信息和使用`openstack role --help`查看相关命令帮助。
215 1
|
C++ 计算机视觉
[Qt5] 各种方式的图像读取,支持中文路径(Halcon)
[Qt5] 各种方式的图像读取,支持中文路径(Halcon)
421 0
[Qt5] 各种方式的图像读取,支持中文路径(Halcon)
|
存储 安全 异构计算
阿里云服务器2核4G、4核8G、8核16G配置最新收费标准及活动价格参考
2核4G、4核8G、8核16G配置的云服务器处理器与内存比为1:2,阿里云个人和普通企业用户在购买云服务器时通常比较喜欢选择2核4G、8核16G、4核8G等配置,这些配置既能满足各种图文类中小型网站和应用又能满足企业网站应用、批量计算、中小型数据库系统等场景,2核4G配置适合新手入门或初创企业,4核8G与8核16G兼具成本与性能优势,适合通用场景,本文介绍这些配置的最新购买价格,包含原价收费标准和最新活动价格。
1172 0
阿里云服务器2核4G、4核8G、8核16G配置最新收费标准及活动价格参考
|
存储 前端开发
RxSwift+MVVM项目实战-MVVM架构介绍以及实战初体验
RxSwift+MVVM项目实战-MVVM架构介绍以及实战初体验
731 0