菜单

4166m金沙runtime适配字体,iOS屏幕适配

2019年9月10日 - 4166am金沙下载
4166m金沙runtime适配字体,iOS屏幕适配

用七个宏 消除 iOS种种机型的显示器适配难题

二个iOS开荒品种无外乎正是纯代码布局、xib或SB布局。那么哪些兑现五个情势的字体大小适配呢?
字体大小适配——纯代码
概念三个宏定义如下
#define SizeScale (SCREEN_WIDTH == 414 ? 1 : 0.83)(我用的7P当做1)

4166m金沙 1

前提条件:

#define SizeScale (SCREEN_WIDTH != 414 ? 1 : 1.2)

适配索尼爱立信X固然没什么难度不过很麻烦,因为导航栏中度一变基本上就影响到了具备页面。

设计员给出的职能图应以iPhone6P为原则。

#define kFont(value) [UIFont systemFontOfSize:value * SizeScale]

如果项目是用的自动布局,适配起来应当会火速,可是很可惜自个儿那么些种类未有利用电动布局。

如哪天候利用那个宏?

在宏中的1.2是在plus下的分寸放大比例,可以依附自身的实在情状来调动。
纯代码中装置字体大小通过运用这几个宏来达成完全适配
字体大小适配——xib或SB
字体大小适配无外乎就是设置UIButton、UILabel、UITextView、UITextField的字体大小
经过创办那多少个的类目来实现(Runtime情势的黑法力method swizzling)
废话非常少说,直接上代码:

曾经偷的懒在三星 X出现的那天一一偿还。

具备控件的尺码、x值y值,

.h

#import <UIKit/UIKit.h>
#import <objc/runtime.h>

/**
 *  button
 */
@interface UIButton (MyFont)

@end


/**
 *  Label
 */
@interface UILabel (myFont)

@end

/**
 *  TextField
 */

@interface UITextField (myFont)

@end

/**
 *  TextView
 */
@interface UITextView (myFont)

@end

为此感到适配繁琐的案由就是:分界面搭建写死了。

cell的可观,文字的字体大小

.m

#import "UIButton+MyFont.h"

//不同设备的屏幕比例(当然倍数可以自己控制)
#define SizeScale (SCREEN_WIDTH == 414 ? 1 : 0.83) // 1:1.2

@implementation UIButton (MyFont)

+ (void)load{
    Method imp = class_getInstanceMethod([self class], @selector(initWithCoder:));
    Method myImp = class_getInstanceMethod([self class], @selector(myInitWithCoder:));
    method_exchangeImplementations(imp, myImp);
}

- (id)myInitWithCoder:(NSCoder*)aDecode{
    [self myInitWithCoder:aDecode];
    if (self) {

        //部分不像改变字体的 把tag值设置成333跳过
        if(self.titleLabel.tag != 333){
            CGFloat fontSize = self.titleLabel.font.pointSize;
            self.titleLabel.font = [UIFont systemFontOfSize:fontSize * SizeScale];
        }
    }
    return self;
}

@end


@implementation UILabel (myFont)

+ (void)load{
    Method imp = class_getInstanceMethod([self class], @selector(initWithCoder:));
    Method myImp = class_getInstanceMethod([self class], @selector(myInitWithCoder:));
    method_exchangeImplementations(imp, myImp);
}

- (id)myInitWithCoder:(NSCoder*)aDecode{
    [self myInitWithCoder:aDecode];
    if (self) {
        //部分不像改变字体的 把tag值设置成333跳过
        if(self.tag != 333){
            CGFloat fontSize = self.font.pointSize;
            self.font = [UIFont systemFontOfSize:fontSize * SizeScale];
        }
    }
    return self;
}

@end

@implementation UITextField (myFont)

+ (void)load{
    Method imp = class_getInstanceMethod([self class], @selector(initWithCoder:));
    Method myImp = class_getInstanceMethod([self class], @selector(myInitWithCoder:));
    method_exchangeImplementations(imp, myImp);
}

- (id)myInitWithCoder:(NSCoder*)aDecode{
    [self myInitWithCoder:aDecode];
    if (self) {
        //部分不像改变字体的 把tag值设置成333跳过
        if(self.tag != 333){
            CGFloat fontSize = self.font.pointSize;
            self.font = [UIFont systemFontOfSize:fontSize * SizeScale];
        }
    }
    return self;
}

@end

@implementation UITextView (myFont)

+ (void)load{
    Method imp = class_getInstanceMethod([self class], @selector(initWithCoder:));
    Method myImp = class_getInstanceMethod([self class], @selector(myInitWithCoder:));
    method_exchangeImplementations(imp, myImp);
}

- (id)myInitWithCoder:(NSCoder*)aDecode{
    [self myInitWithCoder:aDecode];
    if (self) {
        //部分不像改变字体的 把tag值设置成333跳过
        if(self.tag != 333){
            CGFloat fontSize = self.font.pointSize;
            self.font = [UIFont systemFontOfSize:fontSize * SizeScale];
        }
    }
    return self;
}

@end

譬喻说导航栏,项目中的导航栏都以自定义view,初阶化的时候基本是那样的:

怎么着利用那一个宏?

1

在“Supporting Files”文件夹中的”PrefixHeader.pch”编写代码:

2self.naviView = [[CQShopCartNaviView alloc]

#define SYRealValue /414.0f*[UIScreen mainScreen].bounds.size.width)

initWithFrame:CGRectMake(0,0, screenWidth,64)];

在设置值的时候敲SYRealValue就好了。

从未应用电动布局固然了还把高度写死了。。。

诸有此类现在在付出中凡是涉及到设置值的地方,都用那些宏,宏里填的值是以6P为标准的值,尽管跑在4和5上,也能按百分比适配好,没有须求我们忧虑了。

看似的还应该有tabBar,中度写死的49,不过总体项目也就三个tabBar,所以修改也一点也不慢。

适配OPPO X说白了便是修改控件的冲天。。。

本次适配红米 X笔者的一点经验教训就是:

1.必必要合理利用自动布局

自动布局的特点是:它是活的,可以基于结构的变化而变化。

周旋于frame相对布局,自动布局的优势依然很醒指标,不只是此次适配索尼爱立信X,在此以前适配火热被连接时境况栏高度发生退换本人就深有体会了,假诺用的自行布局,根本不须要适配,因为自然即是动态变化的,假诺是相对布局,你要接过状态栏中度退换的文告,然后三个三个页面调度。。。

还应该有,作者迭代开荒一年多的回味是:自动布局面临多变的供给能更加好回答。

2. 通用全局常量一定要用宏定义

这么能够一处改造,全体制改正动。

简简单单便是毫不写死,比如说导航栏中度,直接写64一贯洗白。

适配酷派 X用到的宏有:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图