首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS多次添加subViews和subLayers

iOS多次添加subViews和subLayers
EN

Stack Overflow用户
提问于 2016-09-08 09:41:13
回答 3查看 932关注 0票数 0

我有一个方法来构建接口,将一个subView和一些subLayers添加到主UIView (在下面的代码中是containerView):

代码语言:javascript
复制
- (void)gradeAnimation:(NSNumber*)grade withDuration:(double)duration {

scoreLabel = [[UICountingLabel alloc] init];
scoreLabel.frame = CGRectOffset(_gradeLabel.frame, 0, 5);
[_containerView addSubview:scoreLabel];

// Other code

UIBezierPath *circlePathMin = [UIBezierPath bezierPathWithArcCenter:CGPointMake(_gradientView.center.x, _gradientView.center.y) radius:_gradientView.frame.size.height * 0.5 - 5 startAngle:-M_PI_4*1.2 endAngle:angle1 clockwise:YES];
circleMin               = [CAShapeLayer layer];
circleMin.path          = circlePathMin.CGPath;
circleMin.lineCap       = kCALineCapButt;
circleMin.fillColor     = [UIColor clearColor].CGColor;
circleMin.lineWidth     = 14;
circleMin.strokeColor = [UIColor colorWithRed:246.0/255.0f green:246.0f/255.0f blue:246.0f/255.0f alpha:0.7f].CGColor;
circleMin.zPosition     = 3;
[_containerView.layer addSublayer:circleMin];

UIBezierPath *circlePathMax = [UIBezierPath bezierPathWithArcCenter:CGPointMake(_gradientView.center.x, _gradientView.center.y) radius:_gradientView.frame.size.height * 0.5 - 5 startAngle:angle2 endAngle:5*M_PI_4*1.2 clockwise:YES];
circleMax               = [CAShapeLayer layer];
circleMax.path          = circlePathMax.CGPath;
circleMax.lineCap       = kCALineCapButt;
circleMax.fillColor     = [UIColor clearColor].CGColor;
circleMax.lineWidth     = 14;
circleMax.strokeColor = [UIColor colorWithRed:246.0/255.0f green:246.0f/255.0f blue:246.0f/255.0f alpha:0.7f].CGColor;
circleMax.zPosition     = 3;
[_containerView.layer addSublayer:circleMax];

UIBezierPath *circlePathMiddle = [UIBezierPath bezierPathWithArcCenter:CGPointMake(_gradientView.center.x, _gradientView.center.y) radius:_gradientView.frame.size.height * 0.5 - 5 startAngle:angle1+offsetRight endAngle:angle2+offsetLeft clockwise:YES];
circleMiddle               = [CAShapeLayer layer];
circleMiddle.path          = circlePathMiddle.CGPath;
circleMiddle.lineCap       = kCALineCapButt;
circleMiddle.fillColor     = [UIColor clearColor].CGColor;
circleMiddle.lineWidth     = 14;
circleMiddle.strokeColor = [UIColor colorWithRed:246.0/255.0f green:246.0f/255.0f blue:246.0f/255.0f alpha:0.7f].CGColor;
circleMiddle.zPosition     = 3;
[_containerView.layer addSublayer:circleMiddle];
}

我的问题是,如果我多次调用这个方法,每次都会添加子视图和子层,而不是像我希望的那样重新绘制它们。为什么会发生这种情况?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-08 10:10:32

让我们只讨论一个对象,scoreLabel是UICountingLabel的一个对象。每次调用gradeAnimation: withDuration: method时,都要创建一个新对象并将其添加到视图中。

您可以获取一个属性,然后启动并添加一次视图,并且可以在该方法中更改对象的位置或其他内容。

如果不想更改当前方法,则在调用该方法之前,必须从视图中删除以前的对象。所以在一次我们将只有一个对象在您的观点。

票数 1
EN

Stack Overflow用户

发布于 2016-09-08 09:58:17

如果您使用的是addSublayeraddSubview,那么肯定会为containerView添加新的层或新视图。如果您不想每次添加它,并且希望重绘(我指的是新实例--正如我从您的重绘单词中了解到的),那么添加下面一行,

代码语言:javascript
复制
 _containerView = [[UIView alloc]initWithFrame:self.view.bounds]; // you can set your desired frame 

gradeAnimation方法中作为第一行。因此,它将创建新的实例的每一次。或者您可以先删除sublayerssubviews,然后添加新的!或者,您可以在方法中创建新的containerView,并向其添加子视图和层,并将其分配给_containerView

票数 0
EN

Stack Overflow用户

发布于 2016-09-08 10:36:23

首先,从containerView中删除所有子层。在方法开始时添加下面的代码。

代码语言:javascript
复制
for (CALayer *layer in _containerView) {
    [layer removeFromSuperlayer];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39387559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档