自从iPhone6和iPhone6+出来了以后,iOS开发的程序猿从此走上了和android一样的道路,各种适配,头都大了。特别是万恶的iPhone6+,本来就被图片塞的很臃肿的app现在又要加一套@3x的图片,要知道这一套图片能把app撑大一倍呀。而且@3x图片完全可以压缩成@2x和@1 x的图片,于是我毅然踏上的用一套图片兼容所有设备的道路。历经千辛万苦,摸爬于各大外国论坛,终于让我找到了一个可行的方法。
废话不多说,先上代码:
UIImage+LocalImage.h
?
1
2
3
4
5
6
7
8
#import <UIKit/UIKit.h>
@interface UIImage (LocalImage)
/** 将原本3倍尺寸的图片缩放到设备对应尺寸 */
- (UIImage *)scaledImageFrom3x;
@end
UIImage+LocalImage.m
?
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
#import "UIImage+LocalImage.h"
#import <objc/runtime.h>
// 当前iOS版本
#ifndef __CUR_IOS_VERSION
#define __CUR_IOS_VERSION ([[[UIDevice currentDevice] systemVersion] floatValue] * 10000)
#endif
@implementation UIImage (LocalImage)
+ (void)load
{
if (__CUR_IOS_VERSION >= __IPHONE_8_0) {
// 由于iOS8已经兼容,所以不需要使用下面方法
return;
}
// 改替换实现用代码调用imageNamed:时的图片适应
SEL origM = @selector(imageNamed:);
SEL newM = @selector(imageWithName:);
method_exchangeImplementations(class_getClassMethod(self, origM), class_getClassMethod(self, newM));
// 该替换实现对xib中图片的适应
NSString *className = [[@"UIImage" stringByAppendingString:@"Nib"] stringByAppendingString:@"Placeholder"]; // 这样写是为了避开AppStore审核的代码检查,不一定有效
Method m1 = class_getInstanceMethod(NSClassFromString(className), @selector(initWithCoder:));
Method m2 = class_getInstanceMethod(self, @selector(initWithCoderForNib:));
method_exchangeImplementations(m1, m2);
}
/** 该方法替换原有的imageNamed:方法 */
+ (UIImage *)imageWithName:(NSString *)name
{
UIImage *aImage = [self imageWithName:name];
if (aImage) {
// 如果能取到对应图片,则直接返回
return aImage;
}
NSString *fileName = [name stringByAppendingString:@"@3x.png"];
aImage = [UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:fileName]];
return [aImage scaledImageFrom3x];
}
/** 该方法替换UIImage-Nib-Placeholder中的initWithCoder:,因为xib的图片都是用这个类来初始化的 */
- (id)initWithCoderForNib:(NSCoder *)aDecoder
{
NSString *resourceName = [aDecoder decodeObjectForKey:@"UIResourceName"];
NSString *newResourceName = resourceName;
if ([resourceName hasSuffix:@".png"]) {
newResourceName = [resourceName substringToIndex:resourceName.length -4];
}
return [UIImage imageNamed:newResourceName];
}
/** 将原本3倍尺寸的图片缩放到设备对应尺寸 */
- (UIImage *)scaledImageFrom3x
{
float locScale = [UIScreen mainScreen].scale;
float theRate = 1.0 / 3.0;
UIImage *newImage = nil;
CGSize oldSize = self.size;
CGFloat scaledWidth = oldSize.width * theRate;
CGFloat scaledHeight = oldSize.height * theRate;
CGRect scaledRect = CGRectZero;
scaledRect.size.width = scaledWidth;
scaledRect.size.height = scaledHeight;
UIGraphicsBeginImageContextWithOptions(scaledRect.size, NO, locScale);
[self drawInRect:scaledRect];
newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
if(newImage == nil) {
NSLog(@"could not scale image");
}
return newImage;
}
ios 适配
最新推荐文章于 2024-07-24 23:27:35 发布