编程技巧 - 适配技巧 - 2
2016-04-20 12:15
363 查看
上篇讲了一些对尺寸的简单适配(缩放适配)
我们这里来讲一些对于需求而言的“适配”
1.案例一:如果版本一需要四行视图,版本二需要二行视图,怎么用最少的代码和逻辑判断去实现?
这里可以用到UIView的tag:
@property(nonatomic) NSInteger tag; // default is 0
实现:
#if IS_SECOND_VER == 1
for (int i =1; i < 5; i++) {
[[self.view viewWithTag:300+i] setFrame:[self.view viewWithTag:100+i].frame];
[[self.view viewWithTag:400+i] setFrame:[self.view viewWithTag:200+i].frame];
[[self.view viewWithTag:100+i] setHidden:YES];
[[self.view viewWithTag:200+i] setHidden:YES];
}
#endif
用一个宏定义来控制,另外需要设置这些需要“适配”的视图的tag为规则的101 - 105
经过一个遍历就可以实现了,几乎没有逻辑判断和复杂的代码。
2.案例二:如果有一排的按钮,并且有着不同的title,根据安排显示出来
突然一想,觉得有点蛋疼,这个不是数学的组合排序吗,坑爹,有n种可能,但是细想,如果顺序一致,就非常好办了,只要参考上面的思想即可
首先拿一个数组来获取存在的按钮:
[_existButtonArray removeAllObjects]; // 每次操作前保证数组为空
if (判空1) {
[_existButtonArray addObject:@{@"first" : @"第一个"}];
}
if (判空2)) {
[_existButtonArray addObject:@{@"second" : @"第二个"}];
}
if (判空3)) {
[_existButtonArray addObject:@{@"third" : @"第三个"}];
}
if (判空4)) {
[_existButtonArray addObject:@{@"fourth" : @"第四个"}];
}
if (判空5)) {
[_existButtonArray addObject:@{@"fixth" : @"第五个"}];
}
这里举例是5个,如果是不确定,可以通过一个循环遍历即可
根据数组内数据结构来构建视图布局:
[_existButtonArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
if (obj && [obj isKindOfClass:[NSDictionary class]]) {
NSString *key = [obj allKeys][0];
UIImage *image = [SDKResourceHelper imageNamedFromResourceWithImageName:key withImageType:@"png"];
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(idx*sameWidth, 0, sameWidth, sameHeight)];
[button setImage:image forState:UIControlStateNormal];
[self adjustImageAndTitleEdgeInsetsToCenter:button
[button setTitle:[obj objectForKey:key] forState:UIControlStateNormal];
SEL btnClickedSel = NSSelectorFromString([NSString stringWithFormat:@"%@BtnClicked:", key]);
[button addTarget:self action:btnClickedSel forControlEvents:UIControlEventTouchUpInside];
[_flowMenu addSubview:button];
}
}];
同样地,其他UIImageView UIView等等都可以通过这样的形式实现
我们这里来讲一些对于需求而言的“适配”
1.案例一:如果版本一需要四行视图,版本二需要二行视图,怎么用最少的代码和逻辑判断去实现?
这里可以用到UIView的tag:
@property(nonatomic) NSInteger tag; // default is 0
- (nullable __kindof UIView *)viewWithTag:(NSInteger)tag; // recursive search. includes self
@property(nonatomic,readonly,copy) NSArray<__kindof UIView *> *subviews;
实现:
#if IS_SECOND_VER == 1
for (int i =1; i < 5; i++) {
[[self.view viewWithTag:300+i] setFrame:[self.view viewWithTag:100+i].frame];
[[self.view viewWithTag:400+i] setFrame:[self.view viewWithTag:200+i].frame];
[[self.view viewWithTag:100+i] setHidden:YES];
[[self.view viewWithTag:200+i] setHidden:YES];
}
#endif
用一个宏定义来控制,另外需要设置这些需要“适配”的视图的tag为规则的101 - 105
经过一个遍历就可以实现了,几乎没有逻辑判断和复杂的代码。
2.案例二:如果有一排的按钮,并且有着不同的title,根据安排显示出来
突然一想,觉得有点蛋疼,这个不是数学的组合排序吗,坑爹,有n种可能,但是细想,如果顺序一致,就非常好办了,只要参考上面的思想即可
首先拿一个数组来获取存在的按钮:
[_existButtonArray removeAllObjects]; // 每次操作前保证数组为空
if (判空1) {
[_existButtonArray addObject:@{@"first" : @"第一个"}];
}
if (判空2)) {
[_existButtonArray addObject:@{@"second" : @"第二个"}];
}
if (判空3)) {
[_existButtonArray addObject:@{@"third" : @"第三个"}];
}
if (判空4)) {
[_existButtonArray addObject:@{@"fourth" : @"第四个"}];
}
if (判空5)) {
[_existButtonArray addObject:@{@"fixth" : @"第五个"}];
}
这里举例是5个,如果是不确定,可以通过一个循环遍历即可
根据数组内数据结构来构建视图布局:
[_existButtonArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
if (obj && [obj isKindOfClass:[NSDictionary class]]) {
NSString *key = [obj allKeys][0];
UIImage *image = [SDKResourceHelper imageNamedFromResourceWithImageName:key withImageType:@"png"];
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(idx*sameWidth, 0, sameWidth, sameHeight)];
[button setImage:image forState:UIControlStateNormal];
[self adjustImageAndTitleEdgeInsetsToCenter:button
[button setTitle:[obj objectForKey:key] forState:UIControlStateNormal];
SEL btnClickedSel = NSSelectorFromString([NSString stringWithFormat:@"%@BtnClicked:", key]);
[button addTarget:self action:btnClickedSel forControlEvents:UIControlEventTouchUpInside];
[_flowMenu addSubview:button];
}
}];
同样地,其他UIImageView UIView等等都可以通过这样的形式实现
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用中UISearchDisplayController搜索效果的用法
- IOS开发环境windows化攻略
- iOS应用中UITableView左滑自定义选项及批量删除的实现
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- iOS推送的那些事
- IOS 改变键盘颜色代码