天天看點

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];      
iOS13.6.1系統XR手機圖文按鈕顯示不全問題

注意:用設定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;
        }
    };
}