小编hav*_*hav的帖子

动画圆形UIBezierPath

我有一个项目,我根据设定的进度动画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自我们上次更新以来收缩的情况.我遇到的问题实际上是一些:

  1. 形状始终以45º开始绘制(除非我旋转视图).我还没有找到任何方法来改变这一点,设置startAngle为-45º没有任何区别,因为它总是"弹出"到45.我有什么可以做的,或者我是否必须采用其他绘图方法?
  2. 有什么其他方式可以让这些东西动起来吗?我已经阅读了很多关于使用的内容,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)

core-animation objective-c ios cadisplaylink uibezierpath

17
推荐指数
1
解决办法
8191
查看次数

即使在返回视图后,也会多次调用Delegate方法

我正在创建一个在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返回,将再次调用委托方法.

delegates objective-c ios

6
推荐指数
2
解决办法
3916
查看次数