文档章节

ios模仿android屏幕密度控件自动适配

fuchenxuan
 fuchenxuan
发布于 2016/05/23 22:26
字数 1331
阅读 5
收藏 0

前些日子出来了iphone6和6plus 使的iOS的适配再也不适合用绝对布局了 本人之前一直是做android开发的 最近开始学起了ios 于是也自然而然的学起了蛋疼的autolayout适配 现在在storyboard中是能够熟练用约束适配了 但是总有些特殊情况需要在逻辑代码中适配 于是我想起了android的屏幕密度概念 就想写个工具类 使得在ios的controller中也能轻松的设置控件的具体大小和比例 并自动适配

  1. 必须要在项目启用了autolayout之后才能用 因为工具类里是用vfl来设置大小的

  2. android的屏幕密度其实不是这个意思 计算也比这个复杂的多 不过是借个概念 实现个差不多的效果

  3. 这个工具类主要是用来在使用autolayout布局时设置某个控件一个具体的像素大小的 只不过这个控件的这个具体大小会根据屏幕自动拉伸适配

  4. 设置具体大小的原始标准是4寸屏,设大小时要参照这个 也就是说 比如界面上有个button 在4寸屏时希望他宽高都是50像素 那就直接把他设为50就行了 到了4.7寸和5.5寸时 他的大小自然会等比扩大,至于这个button扩大之后的位置 这个当然在用autolayout的布局约束时就已经控制好的了

  5. 这个适配方法可能不是很好,可能是我才初学 不清楚autolayout的强大 因为不是所有的界面需要显示的控件都能通过他和周围控件的约束就能适配的 直接约束控件大小的话在4寸屏显示正好 但是到了5.5寸虽然位置什么的都正常 但是大小却会变的偏小了 但我觉得autolayout不应该解决不了这个问题的啊 所以在此做个保留 可能是我还没真正领悟到autolayout 下面贴上工具类代码 仅供参考吧


  6. ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
     
    @interface Density : NSObject
     
    /** 模拟android屏幕密度的概念 */
    +(NSInteger)pixelsToDip:( float ) pixels;  // pixels转dip
     
    +( void )setWidth:(UIView *)view currentView:(UIView *)currentView pixels:( float )pixels;  // 设置控件自动适配的width
     
    +( void )setHeight:(UIView *)view currentView:(UIView *)currentView pixels:( float )pixels;  // 设置控件自动适配的height
     
    +( void )setSize:(UIView *)view currentView:(UIView *)currentView pixels:( float )pixels;  // 自动适配控件拉伸比例(宽高相同)
     
    +( void )setSize:(UIView *)view currentView:(UIView *)currentView xPixels:( float )xPixels yPixels:( float ) yPixels;  // 自动适配控件拉伸比例(宽高不同)
     
    +( void )setTextFont:(UILabel *)view size:( float )size;  //自动适配Label文字大小
     
     
    +( void )setMutableWidth:(UIView *)view currentView:(NSDictionary *)currentView pixels:( float )pixels;  // 批量自动适配控件宽度拉伸比例(宽高相同)
    +( void )setMutableSize:(UIView *)view currentView:(NSDictionary *)currentView xPixels:( float )xPixels yPixels:( float ) yPixels;  // 批量自动适配控件拉伸比例(宽高不同)
    +( void )setMutableTextFont:(NSDictionary *)currentView size:( float )size;  // 批量自动适配Label文字大小
     
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#import "Density.h"
 
@implementation Density
 
+(NSInteger)pixelsToDip:( float )pixels
{
     return  [[UIScreen mainScreen]bounds].size.width*pixels/320;
}
 
+( void )setWidth:(UIView *)view currentView:(UIView *)currentView pixels:( float )pixels
{
     NSDictionary *childDis = NSDictionaryOfVariableBindings(currentView);
     
     NSInteger currentX =[Density pixelsToDip:pixels];
     NSMutableDictionary *metrics = [[NSMutableDictionary alloc]init];
     [metrics setObject:[NSString stringWithFormat:@ "%ld" ,( long )currentX] forKey:@ "currentX" ];
     
     [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@ "[currentView(currentX)]"  options:0 metrics:metrics views:childDis]];
 
}
 
+( void )setHeight:(UIView *)view currentView:(UIView *)currentView pixels:( float )pixels
{
     NSDictionary *childDis = NSDictionaryOfVariableBindings(currentView);
     
     NSInteger currentX =[Density pixelsToDip:pixels];
     NSMutableDictionary *metrics = [[NSMutableDictionary alloc]init];
     [metrics setObject:[NSString stringWithFormat:@ "%ld" ,( long )currentX] forKey:@ "currentX" ];
     
     [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@ "V:[currentView(currentX)]"  options:0 metrics:metrics views:childDis]];
}
 
+( void )setSize:(UIView *)view currentView:(UIView *)currentView pixels:( float )pixels
{
     NSDictionary *childDis = NSDictionaryOfVariableBindings(currentView);
     
     NSInteger currentX =[Density pixelsToDip:pixels];
     NSMutableDictionary *metrics = [[NSMutableDictionary alloc]init];
     [metrics setObject:[NSString stringWithFormat:@ "%ld" ,( long )currentX] forKey:@ "currentX" ];
     
     [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@ "[currentView(currentX)]"  options:0 metrics:metrics views:childDis]];
     [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@ "V:[currentView(currentX)]"  options:0 metrics:metrics views:childDis]];
}
 
+( void )setSize:(UIView *)view currentView:(UIView *)currentView xPixels:( float )xPixels yPixels:( float ) yPixels
{
     NSDictionary *childDis = NSDictionaryOfVariableBindings(currentView);
     
     NSInteger currentX =[Density pixelsToDip:xPixels];
     NSInteger currentY =[Density pixelsToDip:yPixels];
 
     NSMutableDictionary *metrics = [[NSMutableDictionary alloc]init];
     [metrics setObject:[NSString stringWithFormat:@ "%ld" ,( long )currentX] forKey:@ "currentX" ];
     [metrics setObject:[NSString stringWithFormat:@ "%ld" ,( long )currentY] forKey:@ "currentY" ];
     
     [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@ "[currentView(currentX)]"  options:0 metrics:metrics views:childDis]];
     [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@ "V:[currentView(currentY)]"  options:0 metrics:metrics views:childDis]];
}
 
+( void )setTextFont:(UILabel *)view size:( float )size
{
       view.font = [UIFont fontWithName:@ "Helvetica-Bold"  size:[Density pixelsToDip:size]];
}
 
+( void )setMutableSize:(UIView *)view currentView:(NSDictionary *)currentView xPixels:( float )xPixels yPixels:( float ) yPixels
{
     NSInteger currentX =[Density pixelsToDip:xPixels];
     NSInteger currentY =[Density pixelsToDip:yPixels];
     NSMutableDictionary *metrics = [[NSMutableDictionary alloc]init];
     [metrics setObject:[NSString stringWithFormat:@ "%ld" ,( long )currentX] forKey:@ "currentX" ];
     [metrics setObject:[NSString stringWithFormat:@ "%ld" ,( long )currentY] forKey:@ "currentY" ];
     
     for  (NSString *key in currentView) {
         NSString *vfl = [NSString stringWithFormat:@ "[%@(currentX)]" ,key];
         NSString *vflY = [NSString stringWithFormat:@ "V:[%@(currentX)]" ,key];
         [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:vfl options:0 metrics:metrics views:currentView]];
         [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:vflY options:0 metrics:metrics views:currentView]];
     }
}
 
+( void )setMutableTextFont:(NSDictionary *)currentView size:( float )size
{
     for  (NSString *key in currentView) {
         UILabel *label = [currentView objectForKey:key];
         label.font= [UIFont fontWithName:@ "Helvetica-Bold"  size:[Density pixelsToDip:size]];
     }
}
 
+( void )setMutableWidth:(UIView *)view currentView:(NSDictionary *)currentView pixels:( float )pixels
{
     NSInteger currentX =[Density pixelsToDip:pixels];
     NSMutableDictionary *metrics = [[NSMutableDictionary alloc]init];
     [metrics setObject:[NSString stringWithFormat:@ "%ld" ,( long )currentX] forKey:@ "currentX" ];
     
     for  (NSString *key in currentView) {
         NSString *vfl = [NSString stringWithFormat:@ "[%@(currentX)]" ,key];
         [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:vfl options:0 metrics:metrics views:currentView]];
     }
 
}
 
@end


最后贴个使用

?
1
[Density setSize:self.view currentView:_logo xPixels:262 yPixels:82];

© 著作权归作者所有

fuchenxuan
粉丝 10
博文 29
码字总数 52850
作品 0
南昌
私信 提问
一款APP,从设计稿到切图(Android篇)

原文出处:BATLCK 依旧声明:这里写的依旧只是某一种工作方法,而不是一种规范,你可以参考,但不要照搬,在具体工作中,一定要灵活运用。 汇总贴,整理了之前零散的关于Android的文章……这...

BAT_LCK
2015/12/03
0
0
迈绝伦团队工作汇总

项目负责人:余志恒 up_java后台:无 mz_java后台:在做抢客推送接口以及规范数据库目录树完成 bwk后台:无 项目负责人:季景胜 up_Android:无 upzg_Android:无 mzqk_Android:UI界面优化 ...

风化的骆驼
2016/12/29
2
0
android 开发流程,及整个团队开发流程讨论

android 开发流程,及整个团队开发流程讨论 *为避免开发进度不对齐,强烈建议每天内部例会一次,例会内容为各开发的进度,当天任务计划等: 以下为想到的开发流程: 下边序号每一个表示一个开...

Z_King_James
2017/07/03
2
1
用好Android图片资源,打造更精致的APP!

前言 由于android系统的开放性,以及IOS的相对封闭。第三方设备想要使用苹果的OS,目前来说是不可能。所以,各厂商纷纷的投入了android的怀抱, android阵营也越来越强大,如今移动操作系统也...

力谱宿云
2016/11/03
587
1
移动端 UI 适配最佳实践(上)

iOS, Android 两个最流行的系统,运行这两款系统的设备千千万,他们的屏幕尺寸也是千千万,这可苦了设计师和攻城狮。 此文试着从原理层面及实践层面来分析下该问题。 基础概念 屏幕尺寸 这个...

yinjq
2015/11/09
420
3

没有更多内容

加载失败,请刷新页面

加载更多

[转] Java 无界阻塞队列 DelayQueue 入门实战

原文出处:http://cmsblogs.com/ 『chenssy』 DelayQueue是一个支持延时获取元素的无界阻塞队列。里面的元素全部都是“可延期”的元素,列头的元素是最先“到期”的元素,如果队列里面没有元...

泥瓦匠BYSocket
7分钟前
1
0
zk中集群版中角色和消息类型

服务器角色 LEADER LEARNER FOLLOWING OBSERVER 消息类型 数据同步 服务器初始化 请求处理型 会话管理型 LEADER 集群工作核心,作用有: 1事务请求唯一调度和处理者,保证事务处理顺序性 2集...

writeademo
9分钟前
2
0
阿里云推送的基本使用-Swift;iOS10+

func initCloudPush(){ CloudPushSDK.asyncInit("*****", appSecret: "*******") { (result) in if result!.success{ print("deviceId===......

west_zll
21分钟前
2
0
分布式及高可用元数据采集原理

转载本文需注明出处:微信公众号EAWorld,违者必究。 引言: 元数据采集是元数据产品的核心部分,如何提升采集效率是需要仔细斟酌的事情,既要保持稳定性也要保持跟上主流技术的发展趋势。元...

EAWorld
36分钟前
2
0
为构建社交关系链手淘都做了啥?

作者|王卫(泓冰) 出品|阿里巴巴新零售淘系技术部 01、淘宝社交关系推荐的背景 1、互联网下半场到来:互联网的下半场,人口红利消失,各大平台需要对用户做精细化运营,用户的增长和留存是每一...

阿里云官方博客
37分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部