HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了iphone – 用我的手指在iOS中绘制贝塞尔曲线?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
嘿,我正在试图弄清楚如何根据用户输入在iOS中生成贝塞尔曲线.这有什么现有的课程吗?有人可以给我一个总体概要,说明需要什么吗?我只是需要帮助才能开始右脚.

解决方法

如果你想留在 objective-c,你可以使用UIBezierPath的addCurveToPoint:controlPoint1:controlPoint2:方法.您还可以使用具有CGPaths的类似命名的函数.使用贝塞尔曲线时,需要4个点:起点,终点和每端的控制点来定义曲线.

定义此方法的一种方法是让用户拖动手指以定义起点和终点,然后点击控制点处的屏幕.这是一个处理此问题的示例视图.

BezierView.h

enum {
    BezierStateNone = 0,BezierStateDefiningLine,BezierStateDefiningCP1,BezierStateDefiningCP2
};
@interface BezierView : UIView {
    CGPoint startPt,endPt,cPt1,cPt2;
    UInt8 state;
    UIBezierPath *curvePath;
  @private
    UITouch *currentTouch;
}
@property (nonatomic,retain) UIBezierPath *curvePath;
@end

BezierView.m

@interface BezierView
@dynamic curvePath;
- (UIBezierPath *)curvePath {
    return [[curvePath retain] autorelease];
}
- (void)setCurvePath:(UIBezierPath *)newPath {
    id tmp = curvePath;
    curvePath = [newPath retain];
    [tmp release];
    state = BezierStateNone;
    [self setNeedsDisplay];
}
- (void)_updateCurve {
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:startPt];
    [path addCurveToPoint:endPt controlPoint1:cPt1 controlPoint2:cPt2];
}
- (void)_calcDefaultControls {
    if(ABS(startPt.x - endPt.X) > ABS(startPt.y - endPt.y)) {
        cPt1 = (CGPoint){(startPt.x + endPt.X) / 2,startPt.y};
        cPt2 = (CGPoint){CPt1.x,endPt.y};
    } else {
        cPt1 = (CGPoint){startPt.x,(startPt.y + endPt.y) / 2};
        cPt2 = (CGPoint){endPt.x,cPt1.y};
    }
}
- (void)drawRect:(CGRect)rect {
    UIBezierPath *path = self.curvePath;
    if(path) [path stroke];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if(currentTouch) return;
    if(state == BezierStateNonE) {
        state = BezierStateDefiningLine;
        currentTouch = [touches anyObject];
        startPt = [currentTouch LOCATIOnInView:self];
    } else if(state == BezierStateDefiningCP1) {
        currentTouch = [touches anyObject];
        cPt1 = [currentTouch LOCATIOnInView:self];
        [self _updateCurve];
    } else if(state == BezierStateDefiningCP2) {
        currentTouch = [touches anyObject];
        cPt2 = [currentTouch LOCATIOnInView:self];
        [self _updateCurve];
    }
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    if(!currentTouch) return;
    if(state == BezierStateDefiningLinE) {
        endPt = [currentTouch LOCATIOnInView:self];
        [self _calcDefaultControls];
        [self _updateCurve];
    } else if(state == BezierStateDefiningCP1) {
        cPt1 = [currentTouch LOCATIOnInView:self];
        [self _updateCurve];
    } else if(state == BezierStateDefiningCP2) {
        cPt2 = [currentTouch LOCATIOnInView:self];
        [self _updateCurve];
    }
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    if(!currentTouch) return;
    if(state == BezierStateDefiningLinE) {
        state = BezierStateDefiningCP1;
    } else if(state == BezierStateDefiningCP1) {
        state = BezierStateDefiningCP2;
    } else if(state == BezierStateDefiningCP2) {
        state = BezierStateNone;
    }
    currentTouch = nil;
}
- (void)touchesCanceled:(NSSet *)touches withEvent:(UIEvent *)event {
    if(state == BezierStateDefiningLinE) {
        self.curvePath = nil;
        self.state = BezierStateNone;
    }
    self.currentTouch = nil;
}

大佬总结

以上是大佬教程为你收集整理的iphone – 用我的手指在iOS中绘制贝塞尔曲线?全部内容,希望文章能够帮你解决iphone – 用我的手指在iOS中绘制贝塞尔曲线?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。