5

当使用 PencilKit API 使用手指/铅笔在屏幕上绘图时,我想将笔划的宽度设置为常数。目前,say中的宽度设置PKInkingTool仅设置用手指或铅笔绘制时的基线宽度,如果用手指/铅笔进行慢速或快速笔划,宽度会有所不同。

我不确定如何设置一个最小示例,有很多代码可以让 PencilKit 视图正常工作。您可以使用Apple 的这个示例来设置一个简单的绘图应用程序。

这是我选择默认绘图工具的代码:

canvas.tool = PKInkingTool(.pen, color: .white, width: 10)

canvas对象在哪里PKCanvasViewvalidWidthRange每个 InkType 中都有一个属性(链接到文档),但我不确定这是否可以帮助我实现我想要的。

4

2 回答 2

7

我找到了一个解决方案(感谢Will Bishop),但是我不确定它是否对每个人都是最好的。我通过在以恒定宽度完成笔画后重新绘制笔画来解决它。Apple 在 WWDC2020 和 iOS 14 上发布了新的 API PKStrokePKStrokePoint这是我的代码的相关部分(newDrawing是具有恒定笔划宽度的新绘图,而canvasView指的是我的当前绘图PKCanvas):

var newDrawingStrokes = [PKStroke]()
    for stroke in canvasView.drawing.strokes {
        var newPoints = [PKStrokePoint]()
        stroke.path.forEach { (point) in
        let newPoint = PKStrokePoint(location: point.location, 
                                     timeOffset: point.timeOffset, 
                                     size: CGSize(width: 5,height: 5), 
                                     opacity: CGFloat(1), force: point.force,
                                     azimuth: point.azimuth, altitude: point.altitude)
        newPoints.append(newPoint)
        }
        let newPath = PKStrokePath(controlPoints: newPoints, creationDate: Date())
        newDrawingStrokes.append(PKStroke(ink: PKInk(.pen, color: UIColor.white), path: newPath))
     }
let newDrawing = PKDrawing(strokes: newDrawingStrokes)

这是我整理的一些初步代码,所以如果您发现任何错误/错误,请告诉我!

于 2020-09-07T15:09:55.580 回答
1

有一种方法可以通过 swizzlingUITouch forcetimestamp方法来修复它。

您可以在项目中添加此 Objective-C 类别:

#import <objc/runtime.h>

@implementation UITouch (UITouch_Overrides)

+ (void)load {
    [super load];

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        [self swizzleForce];
        [self swizzleTimestamp];
    });
}

+ (void)swizzleForce {
    [self swizzle:@selector(force) with:@selector(ed_force)];
}

+ (void)swizzleTimestamp {
    [self swizzle:@selector(timestamp) with:@selector(ed_timestamp)];
}

+ (void)swizzle:(SEL)originalSelector with:(SEL)swizzledSelector {
    Class class = [self class];
    
    Method originalMethod = class_getInstanceMethod(class, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
    BOOL didAddMethod =
        class_addMethod(class,
            originalSelector,
            method_getImplementation(swizzledMethod),
            method_getTypeEncoding(swizzledMethod));
    if (didAddMethod) {
        class_replaceMethod(class,
            swizzledSelector,
            method_getImplementation(originalMethod),
            method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}

- (CGFloat)ed_force {
    return 1.0;
}

- (NSTimeInterval)ed_timestamp {
    return 0;
}

@end
于 2021-09-28T08:08:24.267 回答