动态重绘重新在iPhone大小的圆(Dynamically redraw re sized circ

2019-08-17 08:39发布

什么即时试图做的是有一个用户触摸屏幕,当在圆圈意味着扩大规模的位置检测到触摸(和持续增长),直到使用者放开。

我知道如何检测触摸不过话说试图绘制和画有其越来越大的圆圈重的问题IM。

做这个的最好方式是什么?

Answer 1:

我会用组合UILongPressGestureRecognizerNSTimerUIBezierPath实现这一目标。

首先,设置你的viewDidLoad添加和配置,将容纳要画圆的CAShapeLayer。 下面的代码将最初在屏幕上绘制一个圆具有50点的半径,并添加一个长按手势到主视图。 当然,触摸检测可以永远这样,你想要什么来完成。 哦,你需要进口石英这一点。

- (void)viewDidLoad
{
    [super viewDidLoad];

    circleRadius = 50.0f;

    circle = [CAShapeLayer layer];

    [circle setAnchorPoint:CGPointMake(0.5f, 0.5f)];
    [circle setFillColor:[UIColor clearColor].CGColor];
    [circle setStrokeColor:[UIColor colorWithWhite:0.9f alpha:0.7f].CGColor];
    [circle setLineWidth:5.0f];

    [self.view.layer addSublayer:circle];

    [self drawCircleWithRadius:circleRadius];

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDetected:)];
    [longPress setMinimumPressDuration:0.1];
    [longPress setAllowableMovement:15.0f];
    [self.view addGestureRecognizer:longPress];
}

然后,当长按手势被识别,检查其状态。 如果其状态开始启动一个重复的计时器来调用动画功能。 当手势结束,无效。

- (void)longPressDetected:(UILongPressGestureRecognizer *)sender {
    if (sender.state == UIGestureRecognizerStateBegan) {
        timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(animateImageView) userInfo:nil repeats:YES];
    }else if (sender.state == UIGestureRecognizerStateEnded) {
        [timer invalidate];
    }
}

- (void)animateImageView {
    circleRadius += 10.0f;
    [self drawCircleWithRadius:circleRadius];
}

最后,此功能下面将使用一个CABasicAnimation形状层的路径属性动画上述(10每次)表示的值。 请确保此动画的持续时间比定时器重复间隔不高!

- (void)drawCircleWithRadius:(CGFloat)radius {
    CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"path"];
    [pathAnimation setFromValue:(id)circle.path];
    [pathAnimation setToValue:(id)[UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 2.0f * radius, 2.0f * radius) cornerRadius:radius].CGPath];
    [pathAnimation setDuration:0.1];
    [pathAnimation setRepeatCount:1.0f];
    [pathAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
    circle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 2.0*radius, 2.0*radius) cornerRadius:radius].CGPath;
    circle.position = CGPointMake(CGRectGetMidX(self.view.frame)-radius, CGRectGetMidY(self.view.frame)-radius);
    [circle addAnimation:pathAnimation forKey:@"changePathAnimation"];
}

希望这可以帮助!



Answer 2:

要做到这一点,最好的方法是使用Quartz 2D和动画触摸的形状。

使用这样的事情..

CGContextRef ctxt = [[NSGraphicsContext currentContext] graphicsPort];
CGGradientRef gradient;
CGColorSpaceRef colorSpace;
CGFloat locations[] = {0.0,1.0};
CGFloat components[] = { 0.5,1.0,1.0,1.0, 0.25,0.5,0.5,1.0 };
colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
gradient = CGGradientCreateWithColorComponents(colorSpace,components,locations,
                                               sizeof(locations)/sizeof(CGFloat));
CGPoint start = {70.0,130.0}, end = {100.0,100.0};
CGFloat startRadius = 0.0, endRadius = 90.0;
CGContextDrawRadialGradient(ctxt,gradient,start,startRadius,end,endRadius,0);
CGGradientRelease(gradient);
CGColorSpaceRelease(colorSpace);

在这里找到更多的信息.. 在iOS开发,采用核芯显卡和/或石英2D,我怎么能画充满了这样的方式渐变,它看起来像一个球一个圆?

还与Quartz2d动画技术,请看这里.. https://github.com/neror/CA360



Answer 3:

你要自定义的UIView绘制在drawRect中的圆圈:方法。 处理您的viewController的视图的收缩效应,更新UIView的定制和使用变量:

[myCicleView setNeedsDisplay];

强制视图重绘自身。



Answer 4:

你可以试试这个:

触摸方法

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
   myTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(reDrawCircle) userInfo:nil repeats:YES];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
   [myTimer invalidate];
   myTimer = nil;
}

对于Scalling图片::

-(void)reDrawCircle {

   //Your Code for Circle Re-Draw.
}

当用户触摸,它会启动定时器为您的方法绘制重圈,当用户与触摸结束,它就会失效计时器。 所以它会不会要求重新绘制方法。

我们希望,它会帮助你。
谢谢。



文章来源: Dynamically redraw re sized circle in iPhone