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)。所以有的问题是特别手机问题,可以不修改,没有必要兼容百分之百的手机,若领导一定要修改,只能用笨方法修改了。


目录
相关文章
|
1月前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
29天前
|
传感器 iOS开发 UED
探索iOS生态系统:从App Store优化到用户体验提升
本文旨在深入探讨iOS生态系统的多个方面,特别是如何通过App Store优化(ASO)和改进用户体验来提升应用的市场表现。不同于常规摘要仅概述文章内容的方式,我们将直接进入主题,首先介绍ASO的重要性及其对开发者的意义;接着分析当前iOS平台上用户行为的变化趋势以及这些变化如何影响应用程序的设计思路;最后提出几点实用建议帮助开发者更好地适应市场环境,增强自身竞争力。
|
28天前
|
安全 Android开发 iOS开发
深入探讨Android与iOS系统的差异及未来发展趋势
本文旨在深入分析Android和iOS两大移动操作系统的核心技术差异、用户体验以及各自的市场表现,进一步探讨它们在未来技术革新中可能的发展方向。通过对比两者的开放性、安全性、生态系统等方面,本文揭示了两大系统在移动设备市场中的竞争态势和潜在变革。
|
28天前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
34 1
|
1月前
|
存储 安全 算法
深入探索iOS系统安全机制:保护用户隐私的前沿技术
本文旨在探讨苹果公司在其广受欢迎的iOS操作系统中实施的先进安全措施,这些措施如何共同作用以保护用户的隐私和数据安全。我们将深入了解iOS的安全架构,包括其硬件和软件层面的创新,以及苹果如何通过持续的软件更新来应对新兴的安全威胁。此外,我们还将讨论iOS系统中的一些关键安全功能,如Face ID、加密技术和沙箱环境,以及它们如何帮助防止未经授权的访问和数据泄露。
|
1月前
|
安全 数据安全/隐私保护 Android开发
深入探索iOS系统安全机制:从基础到高级
本文旨在全面解析iOS操作系统的安全特性,从基础的权限管理到高级的加密技术,揭示苹果如何构建一个既开放又安全的移动平台。我们将通过实例和分析,探讨iOS系统如何保护用户数据免受恶意软件、网络攻击的威胁,并对比Android系统在安全性方面的差异。
|
1月前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
108 2
|
1月前
|
安全 搜索推荐 Android开发
Android vs. iOS:解锁智能手机操作系统的奥秘####
【10月更文挑战第21天】 在当今这个数字化时代,智能手机已成为我们生活中不可或缺的伙伴。本文旨在深入浅出地探讨两大主流操作系统——Android与iOS的核心差异、优势及未来趋势,帮助读者更好地理解这两个平台背后的技术哲学和用户体验设计。通过对比分析,揭示它们如何塑造了我们的数字生活方式,并展望未来可能的发展路径。无论您是技术爱好者还是普通用户,这篇文章都将带您走进一个充满创新与可能性的移动世界。 ####
78 3
|
2月前
|
安全 搜索推荐 Android开发
揭秘iOS与Android系统的差异:一场技术与哲学的较量
在当今数字化时代,智能手机操作系统的选择成为了用户个性化表达和技术偏好的重要标志。iOS和Android,作为市场上两大主流操作系统,它们之间的竞争不仅仅是技术的比拼,更是设计理念、用户体验和生态系统构建的全面较量。本文将深入探讨iOS与Android在系统架构、应用生态、用户界面及安全性等方面的本质区别,揭示这两种系统背后的哲学思想和市场策略,帮助读者更全面地理解两者的优劣,从而做出更适合自己的选择。
|
1月前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。