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;
}
};
}