iOS13.6.1系统XR手机图文按钮显示不全问题

简介: iOS13.6.1系统XR手机图文按钮显示不全问题

iOS13.6.1系统XR手机出来了奇怪的问题,图文按钮显示不全问题。比它老的系统或新的系统就是相同的手机都没有出现类似的问题。就是系统相同手机不同也没有出现该问题。

既然测试提出该问题,只能修改了。这是特定手机特定系统适配问题。

修改的思路是:把这个显示图片和文字的按钮拆分成按钮包含一个图片和一个标签,计算出他们的文字宽和图片宽。若有这样大量图文按钮,若找不到对应页面,都这样修改,有可能出现布局不正确的问题。我就是这样的,产生了好几个相关的问题,如:计算文字宽度的小数被舍去了和布局的位置不正确。真不知道为了一个手机在特定的系统下出现该问题,进行大批量修改,并产生了一堆问题是否值得。

出问题的代码:

    UIButton *btn  = [UIButton buttonWithTitle:@"  添加车辆" font:SystemFontOfSize(15) color:MainAPPColor];
    [btn setImage:[UIImage imageNamed:@"icon_car_add"] forState:UIControlStateNormal];
    [btn layoutButtonWithEdgeInsetsStyle:  imageTitleSpace:2];

注意:用设置UISemanticContentAttributeForceLeftToRight或标题加空格,采用分类:UIButton+Commemt.h都搞不定这个手机。另一个带选中效果的问题代码:

                    UIButton *btn = [UIButton buttonWithTitle:@" 0" font:SystemFontOfSize(13) color:TextBlackColor];
            [btn setTitleColor:MainAPPColor forState:UIControlStateSelected];
            [btn setImage:[UIImage imageNamed:@"icon_like_no"] forState:UIControlStateNormal];
            [btn setImage:[UIImage imageNamed:@"icon_like_yes"] forState:UIControlStateSelected];
            [btn addTarget:self action:@selector(likeAction:) forControlEvents:UIControlEventTouchUpInside];
            [btn setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight];
            [btn layoutButtonWithEdgeInsetsStyle:JKButtonEdgeInsetsStyleLeft imageTitleSpace:2];
            [self.contentView addSubview:btn];
            [btn mas_makeConstraints:^(MASConstraintMaker *make) {
                make.left.mas_equalTo(BaseSize(110));
                make.width.mas_equalTo(size.width);
                make.bottom.mas_equalTo(-BaseSize(10));
                make.height.mas_equalTo(BaseSize(24));
            }];
            self.likeBtn = btn;

万能解决方法是生成一个按钮子类,上面增加一个图片和标签:

DYTitleImageBtn.h

#import <UIKit/UIKit.h>
//#import "UIButton+Commemt.h"
// 定义一个枚举(包含了四种类型的button)
typedef NS_ENUM(NSUInteger, JKButtonEdgeInsetsStyle) {
    JKButtonEdgeInsetsStyleTop, // image在上,label在下
    JKButtonEdgeInsetsStyleLeft, // image在左,label在右
    JKButtonEdgeInsetsStyleBottom, // image在下,label在上
    JKButtonEdgeInsetsStyleRight // image在右,label在左
};

NS_ASSUME_NONNULL_BEGIN

@interface DYTitleImageBtn : UIButton

@property (nonatomic,strong)UIImageView *jk_iconImageView;
@property (nonatomic, assign) CGFloat imageTitleSpace;
@property (nonatomic, strong) UILabel *jk_titleLab;
@property (nonatomic, assign) BOOL isSelectContent;
@property (nonatomic, strong) UIImage *icon;
@property (nonatomic, strong) UIImage *selectedIcon;
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *selectedTitle;
@property (nonatomic, assign) JKButtonEdgeInsetsStyle style;
@property (nonatomic, strong) UIColor *titleColor;
@property (nonatomic, strong) UIColor *selectedTitleColor;

+ (instancetype)btnWithFrame:(CGRect)frame title:(NSString *)title  selectedTitle:(NSString *)selectedTitle image:(UIImage *)image selectedImage:(UIImage *)selectedImage  font:(UIFont *)font color:(UIColor *)color  selectedTitleColor:(UIColor *)selectedTitleColor style:(JKButtonEdgeInsetsStyle)style imageTitleSpace:(CGFloat)imageTitleSpace;

+ (CGSize)getSizeWithMaxTitle:(NSString *)maxTitle maxImage:(UIImage *)maxImage font:(UIFont *)font imageTitleSpace:(CGFloat)imageTitleSpace heigth:(CGFloat)height;

-(void)updateLayoutWithFrame:(CGRect)frame title:(NSString *)title;
-(void)updateLayoutWithFrame:(CGRect)frame title:(NSString *)title icon:(UIImage *)icon;
-(void)updateBtnLayoutWithFrame:(CGRect)frame title:(NSString *)title;
@end

NS_ASSUME_NONNULL_END

DYTitleImageBtn.m文件:

#import "DYTitleImageBtn.h"

@implementation DYTitleImageBtn


+ (instancetype)btnWithFrame:(CGRect)frame title:(NSString *)title  selectedTitle:(NSString *)selectedTitle image:(UIImage *)image selectedImage:(UIImage *)selectedImage  font:(UIFont *)font color:(UIColor *)color  selectedTitleColor:(UIColor *)selectedTitleColor style:(JKButtonEdgeInsetsStyle)style imageTitleSpace:(CGFloat)imageTitleSpace;
{
    DYTitleImageBtn *btn = [[self alloc] initWithFrame:frame];
    btn.imageTitleSpace = imageTitleSpace;
    if(!image || ![image isKindOfClass:[UIImage class]] || !selectedImage || ![selectedImage isKindOfClass:[UIImage class]] || !font || ![font isKindOfClass:[UIFont class]])
    {
        [btn setTitle:getNotNilString(title) forState:UIControlStateNormal];
        if(font && [font isKindOfClass:[UIFont class]])
        {
            btn.titleLabel.font = font;
        }
        if(color && [color isKindOfClass:[UIColor class]])
        {
            [btn setTitleColor:color forState:UIControlStateNormal];
        }
        return btn;
    }
    else
    {
        btn.backgroundColor = UIColor.clearColor;
        btn.icon = image;
        btn.selectedIcon = selectedImage;
        btn.selectedTitleColor = selectedTitleColor;
        btn.title = getNotNilString(title);
        btn.selectedTitle = getNotNilString(selectedTitle);
        btn.jk_iconImageView = [[UIImageView alloc] init];
        [btn addSubview:btn.jk_iconImageView];
        btn.jk_iconImageView.backgroundColor = UIColor.clearColor;
        btn.jk_iconImageView.image = image;
        btn.jk_titleLab = [[UILabel alloc] init];
        [btn addSubview:btn.jk_titleLab];
        btn.jk_titleLab.backgroundColor = UIColor.clearColor;
        btn.jk_titleLab.font = font;
        btn.jk_titleLab.text = getNotNilString(btn.title);
        if(color && [color isKindOfClass:[UIColor class]])
        {
            btn.jk_titleLab.textColor = color;
        }
        else
        {
            btn.jk_titleLab.textColor = TextBlackColor;
        }
        if(JKButtonEdgeInsetsStyleRight == style)
        {
            btn.style = style;
            btn.jk_titleLab.textAlignment = NSTextAlignmentRight;
            btn.jk_iconImageView.sd_layout
            .rightSpaceToView(btn, 0)
            .centerYEqualToView(btn)
            .widthIs(image.size.width)
            .heightIs(image.size.height);
            btn.jk_titleLab.sd_layout
            .leftSpaceToView(btn, 0)
            .centerYEqualToView(btn)
            .rightSpaceToView(btn.jk_iconImageView, imageTitleSpace)
            .heightIs(frame.size.height);
        }
        else
        {
            btn.style = JKButtonEdgeInsetsStyleLeft;
            btn.jk_titleLab.textAlignment = NSTextAlignmentLeft;
            btn.jk_iconImageView.sd_layout
            .leftSpaceToView(btn, 0)
            .centerYEqualToView(btn)
            .widthIs(image.size.width)
            .heightIs(image.size.height);
            btn.jk_titleLab.sd_layout
            .rightSpaceToView(btn, 0)
            .centerYEqualToView(btn)
            .leftSpaceToView(btn.jk_iconImageView, imageTitleSpace)
            .heightIs(frame.size.height);
        }

        return btn;
    }
}

-(void)setIsSelectContent:(BOOL)isSelectContent
{
    _isSelectContent = isSelectContent;
    if(isSelectContent)
    {
        self.jk_iconImageView.image = self.selectedIcon;
        self.jk_titleLab.text = self.selectedTitle;
        if(self.selectedTitleColor && [self.selectedTitleColor isKindOfClass:[UIColor class]])
        {
            self.jk_titleLab.textColor = self.selectedTitleColor;
        }
        
    }
    else
    {
        self.jk_iconImageView.image = self.icon;
        self.jk_titleLab.text = self.title;
        if(self.titleColor && [self.titleColor isKindOfClass:[UIColor class]])
        {
            self.jk_titleLab.textColor = self.titleColor;
        }
    }
}


+ (CGSize)getSizeWithMaxTitle:(NSString *)maxTitle maxImage:(UIImage *)maxImage font:(UIFont *)font imageTitleSpace:(CGFloat)imageTitleSpace heigth:(CGFloat)height
{
    if(isCommonUnitEmptyString(maxTitle) || !maxImage || ![maxImage isKindOfClass:[UIImage class]] || !font || ![font isKindOfClass:[UIFont class]])
    {
        return CGSizeMake(60, 18);
    }
    NSDictionary *attributes = @{NSFontAttributeName :font};     //字体属性,设置字体的font
    CGSize maxSize = CGSizeMake(FULL_WIDTH, FULL_HEIGHT);     //设置字符串的宽高
    CGSize size = [maxTitle boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil].size;
    CGFloat labelWidth = size.width;
    if((labelWidth != ((NSInteger)labelWidth)))
    {
        labelWidth = labelWidth + 0.5;
    }
    CGFloat height1 = height;
    if(height1 < size.height)
    {
        height1 = size.height;
    }
    
    if(height1 < maxImage.size.height)
    {
        height1 = maxImage.size.height;
    }
    return CGSizeMake(labelWidth+imageTitleSpace+maxImage.size.width, height1);
}

-(void)updateLayoutWithFrame:(CGRect)frame title:(NSString *)title
{
    CGFloat titleLabWidth  = frame.size.width - self.imageTitleSpace - self.icon.size.width;
    if(self.jk_titleLab && titleLabWidth > 0)
    {
        self.title = getNotNilString(title);
        self.selectedTitle = getNotNilString(title);
        self.jk_titleLab.text = self.title;
        self.jk_titleLab.sd_layout
            .widthIs(titleLabWidth)
            .centerYEqualToView(self)
            .leftSpaceToView(self.jk_iconImageView, self.imageTitleSpace)
            .heightIs(self.frame.size.height);
        [self.jk_titleLab updateLayout];
    }
}

-(void)updateBtnLayoutWithFrame:(CGRect)frame title:(NSString *)title
{
    self.frame = frame;
    CGFloat titleLabWidth  = frame.size.width - self.imageTitleSpace - self.icon.size.width;
    if(self.jk_titleLab && titleLabWidth > 0)
    {
        self.title = getNotNilString(title);
        self.selectedTitle = getNotNilString(title);
        self.jk_titleLab.text = self.title;
        self.jk_titleLab.frame = CGRectMake(self.imageTitleSpace + self.icon.size.width, 0, titleLabWidth, frame.size.height);
    }
}

-(void)updateLayoutWithFrame:(CGRect)frame title:(NSString *)title icon:(UIImage *)icon
{
    self.frame = frame;
    if(isCommonUnitEmptyString(title) || !icon)
    {
        return;
    }
    self.icon = icon;
    self.selectedIcon = icon;
    CGFloat titleLabWidth  = frame.size.width - self.imageTitleSpace - self.icon.size.width;
    if(self.jk_iconImageView)
    {
        if(JKButtonEdgeInsetsStyleRight == self.style)
        {
            self.jk_iconImageView.sd_layout
            .rightSpaceToView(self, 0)
            .centerYEqualToView(self)
            .widthIs(self.icon.size.width)
            .heightIs(self.icon.size.height);
        }
        else
        {
            self.jk_iconImageView.sd_layout
            .leftSpaceToView(self, 0)
            .centerYEqualToView(self)
            .widthIs(self.icon.size.width)
            .heightIs(self.icon.size.height);
        }
        [self.jk_iconImageView updateLayout];
    }
    if(self.jk_titleLab && titleLabWidth > 0)
    {
        self.title = getNotNilString(title);
        self.selectedTitle = getNotNilString(title);
        self.jk_titleLab.text = self.title;
        self.jk_titleLab.sd_layout
            .widthIs(titleLabWidth)
            .centerYEqualToView(self)
            .leftSpaceToView(self.jk_iconImageView, self.imageTitleSpace)
            .heightIs(frame.size.height);
        [self.jk_titleLab updateLayout];
    }
}

@end

使用的代码:

            CGSize size = [DYTitleImageBtn getSizeWithMaxTitle:@"9999" maxImage:[UIImage imageNamed:@"icon_like_no"] font:SystemFontOfSize(13) imageTitleSpace:5 heigth:BaseSize(24)];
            DYTitleImageBtn *btn = [DYTitleImageBtn btnWithFrame:CGRectMake(0, 0, size.width, size.height) title:@"0" selectedTitle:@"0" image:[UIImage imageNamed:@"icon_like_no"] selectedImage:[UIImage imageNamed:@"icon_like_yes"] font:SystemFontOfSize(13) color:TextBlackColor  selectedTitleColor:MainAPPColor style:JKButtonEdgeInsetsStyleLeft imageTitleSpace:5.0];
            [btn addTarget:self action:@selector(likeAction:) forControlEvents:UIControlEventTouchUpInside];
            [self.contentView addSubview:btn];
            [btn mas_makeConstraints:^(MASConstraintMaker *make) {
                make.left.mas_equalTo(BaseSize(110));
                make.width.mas_equalTo(size.width);
                make.bottom.mas_equalTo(-BaseSize(10));
                make.height.mas_equalTo(BaseSize(24));
            }];
            self.likeBtn = btn;

更新数据:

- (void)likeAction:(DYTitleImageBtn *)sender{
    DYWeakSelf;
    [NetWorkManager postWithPath:Url_Course_Favor param:@{@"CourseId":@(self.model.CourseId)} dataClass:[TSCourseModel class] isArray:NO].complete = ^(DYNetModel *net, TSCourseModel * data) {
        if (net.code == DYNetModelStateSuccess) {
            weakSelf.model.FavorCount = data.FavorCount;
            [sender setSelected:YES];
            weakSelf.likeBtn.userInteractionEnabled = NO;
//            [sender setTitle:[NSString stringWithFormat:@" %ld",(long)data.FavorCount] forState:UIControlStateNormal];
//            weakSelf.likeBtn.jk_titleLab.text = [NSString stringWithFormat:@"%ld",(long)data.FavorCount];
            CGSize size = [DYTitleImageBtn getSizeWithMaxTitle:[NSString stringWithFormat:@" %ld",(long)data.FavorCount] maxImage:[UIImage imageNamed:@"icon_like_no"] font:SystemFontOfSize(13) imageTitleSpace:5 heigth:BaseSize(24)];
            [weakSelf.likeBtn updateLayoutWithFrame:CGRectMake(0, 0, size.width, size.height) title:[NSString stringWithFormat:@" %ld",(long)data.FavorCount]];
            [weakSelf.likeBtn mas_remakeConstraints:^(MASConstraintMaker *make) {
                make.left.mas_equalTo(BaseSize(110));
                make.width.mas_equalTo(size.width);
                make.bottom.mas_equalTo(-BaseSize(10));
                make.height.mas_equalTo(BaseSize(24));
            }];
            weakSelf.likeBtn.isSelectContent = YES;
        }
    };
}

一个测试用他的手机iPhone xr ios 13.6.1测试出来该问题:结果找到iOS13.6.1 iPhone 6手机和iOS 15 iPhone xr手机都测试正常。老板非要修改没有办法,只能把图文按钮拆分为按钮,图文和标签三个控件才能解决。苹果的手机屏幕不是完全相等的,可能他那个手机比标准尺寸小一点点,我见一个同事的手机屏幕高比标准标屏幕多一点点(他的屏幕高度是比标准屏幕高高0.000002)。所以有的问题是特别手机问题,可以不修改,没有必要兼容百分之百的手机,若领导一定要修改,只能用笨方法修改了。


目录
相关文章
|
2月前
|
安全 5G 语音技术
Cisco ASR 9000 Router IOS XR Release 7.11.2 MD - ASR 9000 系列聚合服务路由器系统软件
Cisco ASR 9000 Router IOS XR Release 7.11.2 MD - ASR 9000 系列聚合服务路由器系统软件
214 4
Cisco ASR 9000 Router IOS XR Release 7.11.2 MD - ASR 9000 系列聚合服务路由器系统软件
|
7月前
|
iOS开发
Cisco Catalyst 9800 Wireless Controller, IOS XE Release 17.17.1 ED - 思科无线控制器系统软件
Cisco Catalyst 9800 Wireless Controller, IOS XE Release 17.17.1 ED - 思科无线控制器系统软件
237 9
Cisco Catalyst 9800 Wireless Controller, IOS XE Release 17.17.1 ED - 思科无线控制器系统软件
|
云安全 安全 Cloud Native
Cisco Catalyst 8000 Series IOS XE 17.18.1a ED 发布 - 思科边缘平台系列系统软件
Cisco Catalyst 8000 Series IOS XE 17.18.1a ED - 思科边缘平台系列系统软件
106 0
|
运维 监控 安全
Cisco ISR 4000 Series IOS XE 17.18.1a ED 发布 - 思科 4000 系列集成服务路由器 IOS XE 系统软件
Cisco ISR 4000 Series IOS XE 17.18.1a ED - 思科 4000 系列集成服务路由器 IOS XE 系统软件
123 0
|
人工智能 监控 安全
思科 Catalyst 9000 交换产品系列 IOS XE 系统软件 17.18.1 ED
Cisco Catalyst 9000 Series Switches, IOS XE Release 17.18.1 ED
150 0
|
10月前
|
数据采集 人工智能 编解码
算法系统协同优化,vivo与港中文推出BlueLM-V-3B,手机秒变多模态AI专家
BlueLM-V-3B是由vivo与香港中文大学共同研发的多模态大型语言模型,专为移动设备优化。它通过算法和系统协同优化,实现了高效部署和快速生成速度(24.4 token/s),并在OpenCompass基准测试中取得优异成绩(66.1分)。模型小巧,语言部分含27亿参数,视觉编码器含4000万参数,适合移动设备使用。尽管如此,低端设备可能仍面临资源压力,实际应用效果需进一步验证。论文链接:https://arxiv.org/abs/2411.10640。
375 9
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
748 21
|
12月前
|
JavaScript 前端开发 iOS开发
ios样式开关按钮jQuery插件
ios样式开关按钮jQuery插件
158 7
|
传感器 iOS开发 UED
探索iOS生态系统:从App Store优化到用户体验提升
本文旨在深入探讨iOS生态系统的多个方面,特别是如何通过App Store优化(ASO)和改进用户体验来提升应用的市场表现。不同于常规摘要仅概述文章内容的方式,我们将直接进入主题,首先介绍ASO的重要性及其对开发者的意义;接着分析当前iOS平台上用户行为的变化趋势以及这些变化如何影响应用程序的设计思路;最后提出几点实用建议帮助开发者更好地适应市场环境,增强自身竞争力。
|
安全 Android开发 iOS开发
深入探讨Android与iOS系统的差异及未来发展趋势
本文旨在深入分析Android和iOS两大移动操作系统的核心技术差异、用户体验以及各自的市场表现,进一步探讨它们在未来技术革新中可能的发展方向。通过对比两者的开放性、安全性、生态系统等方面,本文揭示了两大系统在移动设备市场中的竞争态势和潜在变革。