凌雪
2018-10-23
来源 :网络
阅读 2669
评论 0
摘要:本文将带你了解IOS开发入门iOS 复制一个UIView对象实现方法,希望本文对大家学IOS有所帮助。
本文将带你了解IOS开发入门iOS 复制一个UIView对象实现方法,希望本文对大家学IOS有所帮助。
iOS 复制一个UIView对象,项目中要做一个新手引导,也就是给某个页面加个遮罩,然后突出显示出一块视图,在写点提示啥的。
我的思路是加一个一模一样的视图到遮罩上,但是问题来了,简单的视图是可以这么搞,复杂一点的难道也要创建一个一模一样的吗,那样岂不是太麻烦了。
能不能直接复制一份出来,然后加到遮罩上呢?
我们都知道复制数组、字典、字符串这些用copy,mutableCopy,然后我就想当然的用我的自定义View调了一下copy,结果很尴尬,直接给崩了,说是要实现copyWithZone这个方法。
总不能所有的自定义View都是实现一遍一个方法吧!
网友们给出这么一个方法,我欣喜若狂,赶紧拿去试一试
NSData *archiveData = [NSKeyedArchiver archivedDataWithRootObject:view];
UIView *copyView = [NSKeyedUnarchiver unarchiveObjectWithData:archiveData];
然而这个方法并不完美,在复制的copyView中,虽然所有的子控件都能显示出来,但是地址都是nii,当然这不是问题的关键,最致命的是子控件里面包含圆角的话,复制出来后,子控件的圆角都么得啦。这就不能忍了,于是就有了这篇博客,我想了笨方法,给复制出来的View的子控件,加上本该有的圆角!
一言不合就上代码:
@implementation GuideView
- (instancetype)init
{
self = [super init];
if (self) {
self.backgroundColor = [UIColor colorWithWhite:0 alpha:0.3];
self.frame = [UIScreen mainScreen].bounds;
self.alpha = 0;
}
return self;
}
+ (instancetype)guideView{
return [[GuideView alloc] init];
}
- (void)addToView:(UIView *)view{
[self addToView:view containCorner:NO];
}
/** 加给某个View上*/
- (void)addToView:(UIView *)view containCorner:(BOOL)containCorner{
// 这样复制后,如果有子控件设置了圆角,复制后圆角会失效,而且所有子控件虽然都能显示正确,但地址都是nil
NSData *archiveData = [NSKeyedArchiver archivedDataWithRootObject:view];
UIView *copyView = [NSKeyedUnarchiver unarchiveObjectWithData:archiveData];
// 子控件如果包含圆角
if (containCorner == YES) {
// 替换子控件
NSData * subData = [NSKeyedArchiver archivedDataWithRootObject:view.subviews];
NSArray* subViews = [NSKeyedUnarchiver unarchiveObjectWithData:subData];
[copyView removeAllSubviews];
for (UIView *subview in subViews) {
[copyView addSubview:subview];
}
// 在原View中找到设置了圆角的子控件
for (UIView *subView in view.subviews) {
if (subView.layer.cornerRadius != 0)
{
// 在复制好的View的子控件中遍历,找到与之对应的子控件
for (UIView *copySubView in copyView.subviews) {
// 给找到的控件设置上圆角,这里通过frame确定是否是同一个控件
if ([NSStringFromCGRect(copySubView.frame) isEqualToString:NSStringFromCGRect(subView.frame)]) {
copySubView.layer.cornerRadius = subView.layer.cornerRadius;
copySubView.layer.masksToBounds = YES;
break;
}
}
}
}
}
copyView.frame = [view convertRect:view.bounds toView:kAppDelegate.window];
[self addSubview:copyView];
}
- (void)show{
[kAppDelegate.window addSubview:self];
[UIView animateWithDuration:0.3 animations:^{
self.alpha = 1;
}];
}
- (void)disMiss{
[UIView animateWithDuration:0.3 animations:^{
self.alpha = 1;
} completion:^(BOOL finished) {
[self removeFromSuperview];
}];
}
//- (void)touchesBegan:(NSSet<uitouch> *)touches withEvent:(UIEvent *)event{
// [super touchesBegan:touches withEvent:event];
// [self disMiss];
//}
@end</uitouch>
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!
喜欢 | 0
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号