iOS重新定義系統自帶的方法,如 重定義 CGRectMake 和 CGPointMake 可以解決螢幕適配的問題
阿新 • • 發佈:2019-02-15
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">在網上找了些螢幕適配的方法,因為之前的適配把螢幕劃分為不同比例的部分,還有就是使用 storyBoard ,由於是純程式碼開發,又是在基本功能都完成了之後 才適配,就想著找一些簡單的適配方法</span>
手機型號 | 寬 | 長 |
iPhone 4s | 320 | 480 |
iPhone 5 | 320 | 568 |
iPhone 5s | 320 | 568 |
iPhone 6 | 375 | 667 |
iPhone 6 plus | 414 | 736 |
iPhone 6s | 375 | 667 |
iPhone 6s plus | 414 | 736 |
每個螢幕之間都是有一定的比例的,如果你做好了一個型號的話,想讓其他型號顯示的效果也和這個做好的型號的效果相同,那麼就可以用這個方法:通過計算各個尺寸手機的比例 重新定義 CGRectMake 和 CGPointMake 方法,那麼效果是一樣的
1, 在 AppDelegate.h 檔案中 宣告:
@property float autoSizeScaleX;
@property float autoSizeScaleY;
2, 在 AppDelegate.m 檔案中 寫如下方法
3, 在你要適配的 地方- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate]; if (kScreenHeight != 667) { myDelegate.autoSizeScaleX = kScreenWidth/375; myDelegate.autoSizeScaleY = kScreenHeight/667; } else { myDelegate.autoSizeScaleX = 1.0; myDelegate.autoSizeScaleY = 1.0; } return YES; }
匯入 AppDelegate.h
然後在 檔案最下方 寫重構 CGRectMake 和 CGPointMake 方法
CG_INLINE CGRect CGRectMake1(CGFloat x, CGFloat y, CGFloat width, CGFloat height) { AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate]; CGRect rect; rect.origin.x = x * myDelegate.autoSizeScaleX; rect.origin.y = y * myDelegate.autoSizeScaleY; rect.size.width = width * myDelegate.autoSizeScaleX; rect.size.height = height * myDelegate.autoSizeScaleY; return rect; } CG_INLINE CGPoint CGPointMake1(CGFloat x, CGFloat y) { AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate]; CGPoint point; point.x = x * myDelegate.autoSizeScaleX; point.y = y * myDelegate.autoSizeScaleY; return point; }
在需要適配的控制元件 初始化的地方 ,把 CGRectMake 和 CGPointMake 換成 CGRectMake1 和 CGPointMake1,如:
UIImageView *imgView = [[UIImageView alloc]initWithFrame:CGRectMake1(0, 0, image.size.width/2, image.size.height/2)];
imgView.center = CGPointMake1(604/4, 174/2+image.size.height/2/2);
需要注意的是 在重構方法的時候 不能與要重構的方法重名,否則報錯