gpt4 book ai didi

macos - 为什么我不能使用 Quartz 在 OS X 上绘制具有不同线帽/连接的虚线?

转载 作者:行者123 更新时间:2023-12-03 16:30:50 29 4
gpt4 key购买 nike

我正在尝试为 this question 构建一个测试用例。为此,我需要绘制一 strip 有与默认值不同的端点和连接的虚线;例如,带有圆形线帽。 Gelphman 和 Laden 的《Programming with Quartz》一书说我应该能够;第 125 页讨论了很多有关绘制具有不同大写和连接的虚线的内容,甚至有一个图显示了具有不同大写的虚线的外观。

但是,当我运行时

CGFloat lengths[2] = { 5, 3 };
CGContextMoveToPoint(c, 50, 50);
CGContextAddLineToPoint(c, 100, 30);
CGContextAddLineToPoint(c, 150, 70);
CGContextAddLineToPoint(c, 200, 50);
CGContextSetLineWidth(c, 10);
CGContextSetLineJoin(c, kCGLineJoinBevel);
CGContextSetLineCap(c, kCGLineCapRound);
CGContextSetLineDash(c, 0, lengths, 2);
CGContextSetRGBStrokeColor(c, 0, 0, 0, 1);
CGContextStrokePath(c);

我看到的是实线,而不是虚线。如果我注释掉以下两行:

CGContextSetLineJoin(c, kCGLineJoinBevel);
CGContextSetLineCap(c, kCGLineCapRound);

然后我就看到了我的潇洒。其中一条线本身会导致绘图恢复为实线。

我不知道发生了什么。已提供示例程序。这是在 OS X 10.10 上;我需要将目标定位到 10.7。

这适用于 OS X,不适用于 iOS。

谢谢。

// 15 october 2015
#import <Cocoa/Cocoa.h>

@interface dashStrokeView : NSView
@end

void putstr(CGContextRef c, const char *str, double x, double y)
{
NSFont *sysfont;
CFStringRef string;
CTFontRef font;
CFStringRef keys[1];
CFTypeRef values[1];
CFDictionaryRef attrs;
CFAttributedStringRef attrstr;
CTLineRef line;

sysfont = [NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSRegularControlSize]];
font = (CTFontRef) sysfont; // toll-free bridge

string = CFStringCreateWithCString(kCFAllocatorDefault,
str, kCFStringEncodingUTF8);
keys[0] = kCTFontAttributeName;
values[0] = font;
attrs = CFDictionaryCreate(kCFAllocatorDefault,
keys, values,
1,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
attrstr = CFAttributedStringCreate(kCFAllocatorDefault, string, attrs);

line = CTLineCreateWithAttributedString(attrstr);
CGContextSetTextPosition(c, x, y);
CTLineDraw(line, c);

CFRelease(line);
CFRelease(attrstr);
CFRelease(attrs);
CFRelease(string);
}

@implementation dashStrokeView

- (void)drawRect:(NSRect)r
{
CGContextRef c;
CGFloat lengths[2] = { 5, 3 };
CGMutablePathRef buildpath;
CGPathRef copy, copy2;

c = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];

CGContextSaveGState(c);

putstr(c, "Dash + Stroke With CGContext Functions", 10, 10);
CGContextMoveToPoint(c, 50, 50);
CGContextAddLineToPoint(c, 100, 30);
CGContextAddLineToPoint(c, 150, 70);
CGContextAddLineToPoint(c, 200, 50);
CGContextSetLineWidth(c, 10);
CGContextSetLineJoin(c, kCGLineJoinBevel);
CGContextSetLineCap(c, kCGLineCapRound);
CGContextSetLineDash(c, 0, lengths, 2);
CGContextSetRGBStrokeColor(c, 0, 0, 0, 1);
CGContextStrokePath(c);

CGContextTranslateCTM(c, 0, 100);
putstr(c, "Dash With CGPath Functions", 10, 10);

CGContextTranslateCTM(c, 0, 100);
putstr(c, "Dash + Stroke With CGPath Functions", 10, 10);

CGContextRestoreGState(c);
}

- (BOOL)isFlipped
{
return YES;
}

@end

@interface appDelegate : NSObject<NSApplicationDelegate>
@end

@implementation appDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)note
{
NSWindow *mainwin;
NSView *contentView;
dashStrokeView *view;
NSDictionary *views;
NSArray *constraints;

mainwin = [[NSWindow alloc] initWithContentRect: NSMakeRect(0, 0, 320, 240)
styleMask:(NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask)
backing:NSBackingStoreBuffered
defer:YES];
[mainwin setTitle:@"Dash/Stroke Example"];
contentView = [mainwin contentView];

view = [[dashStrokeView alloc] initWithFrame:NSZeroRect];
[view setTranslatesAutoresizingMaskIntoConstraints:NO];
[contentView addSubview:view];

views = NSDictionaryOfVariableBindings(view);
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[view]-|"
options:0
metrics:nil
views:views];
[contentView addConstraints:constraints];
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[view]-|"
options:0
metrics:nil
views:views];
[contentView addConstraints:constraints];

[mainwin cascadeTopLeftFromPoint:NSMakePoint(20, 20)];
[mainwin makeKeyAndOrderFront:nil];
}

- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)app
{
return YES;
}

@end

int main(void)
{
NSApplication *app;

app = [NSApplication sharedApplication];
[app setActivationPolicy:NSApplicationActivationPolicyRegular];
[app setDelegate:[appDelegate new]];
[app run];
return 0;
}

最佳答案

问题在于 CGFloat lengths 的值不够大,无法从其路径中辨别出来。增加浮点值将使斜角和盖子的间距更充分:

CGFloat lengths[2] = { 10, 13 };

你现在得到它的方式实际上是绘图(而不是恢复),尽管它是如此微小以至于它自身重叠,这本质上创建了一条实线。

关于macos - 为什么我不能使用 Quartz 在 OS X 上绘制具有不同线帽/连接的虚线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33159278/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com