我有一个项目,我根据设定的进度动画UIBezierPath.BezierPath呈圆形,位于UIView中,动画现在使用CADisplayLink在drawRect中完成.简单地说,根据设定的进度x,路径应径向延伸(如果x比之前大)或收缩(如果x更小).
self.drawProgress = (self.displayLink.timestamp - self.startTime)/DURATION;
CGFloat startAngle = -(float)M_PI_2;
CGFloat stopAngle = ((self.x * 2*(float)M_PI) + startAngle);
CGFloat currentEndAngle = ((self.oldX * 2*(float)M_PI) + startAngle);
CGFloat endAngle = currentEndAngle-((currentEndAngle-stopAngle)*drawProgress);
UIBezierPath *guideCirclePath = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES];
Run Code Online (Sandbox Code Playgroud)
这是x自我们上次更新以来收缩的情况.我遇到的问题实际上是一些:
startAngle为-45º没有任何区别,因为它总是"弹出"到45.我有什么可以做的,或者我是否必须采用其他绘图方法?CAShapeLayer但我还没有完全理解使用这两种方法的实际差异(在缺点和好处方面).如果有人能澄清我会非常感激!更新:我将代码迁移到CAShapeLayer,但现在我面临着另一个问题.最好用这张图片描述:

发生的事情是,当层应该收缩时,薄的外线仍然存在(无论移动方向如何).当棒收缩时,x除非我明确地在其上形成新的白色形状,否则不会除去1-的Δ .这个代码如下.有任何想法吗?
UIBezierPath *circlePath = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startAngle endAngle:stopAngle clockwise:YES];
CAShapeLayer *circle = [CAShapeLayer layer];
circle.path = [circlePath CGPath]; …Run Code Online (Sandbox Code Playgroud) 我正在创建一个在iOS 7中使用新条形码扫描程序的应用程序,但我遇到了委托方法的一些问题.扫描程序正确识别条形码并调用委托方法,但它执行速度太快,因此调用连续多次发生,导致segue被执行多次.代表方法如下.
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
connection.enabled = NO;
self.conn = connection;
for (AVMetadataObject *metadata in metadataObjects) {
if ([metadata.type isEqualToString:AVMetadataObjectTypeEAN8Code] || [metadata.type isEqualToString:AVMetadataObjectTypeEAN13Code]) {
self.strValue = [(AVMetadataMachineReadableCodeObject *)metadata stringValue];
NSLog(@"%@", [(AVMetadataMachineReadableCodeObject *)metadata corners]);
}
}
[self performSegueWithIdentifier:@"newSegue" sender:self];
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果我没有connection.enabled = NO在开始行中设置,则会多次调用委托,从而导致损坏的视图层次结构(然后崩溃).另一个问题是当我禁用连接然后self.conn = YES在viewWillAppear中重新启用连接时,将在返回视图时从先前的扫描重复调用该委托.这会导致视图层次结构中出现另一个损坏.
总而言之:快速连续多次调用委托方法,或者在返回视图时使用(旧)扫描调用委托.任何帮助,将不胜感激.
编辑:我已经部分设法解决了与委托一些烦躁的问题,但我仍然有一个问题,委托方法被多次调用.如果您在不到五秒的时间内从下一个viewcontroller返回,将再次调用委托方法.