4

このグリッドの背景を取得する簡単な方法はありますか? それとも、このようなことをしなければなりません[NSColor colorWithPatternImage:[NSImage ...]]か?

インターフェイスのスクリーンショット

完全なコードは必要ありません。それを行う簡単な方法があるかどうか、ある場合はその方法を知りたいだけです。

4

6 に答える 6

7

これが私の解決策です:

- (void)drawRect:(NSRect)dirtyRect
{
CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];
[[NSColor whiteColor] setFill];
CGContextFillRect(context, dirtyRect);

for (int i = 1; i < [self bounds].size.height / 10; i++) {
    if (i % 10 == 0) {
        [[NSColor colorWithSRGBRed:100/255.0 green:149/255.0 blue:237/255.0 alpha:0.3] set];
    } else if (i % 5 == 0) {
        [[NSColor colorWithSRGBRed:100/255.0 green:149/255.0 blue:237/255.0 alpha:0.2] set];
    } else {
        [[NSColor colorWithSRGBRed:100/255.0 green:149/255.0 blue:237/255.0 alpha:0.1] set];
    }
    [NSBezierPath strokeLineFromPoint:NSMakePoint(0, i * 10 - 0.5) toPoint:NSMakePoint([self bounds].size.width, i * 10 - 0.5)];
}
for (int i = 1; i < [self bounds].size.width / 10; i++) {
    if (i % 10 == 0) {
        [[NSColor colorWithSRGBRed:100/255.0 green:149/255.0 blue:237/255.0 alpha:0.3] set];
    } else if (i % 5 == 0) {
        [[NSColor colorWithSRGBRed:100/255.0 green:149/255.0 blue:237/255.0 alpha:0.2] set];
    } else {
        [[NSColor colorWithSRGBRed:100/255.0 green:149/255.0 blue:237/255.0 alpha:0.1] set];
    }
    [NSBezierPath strokeLineFromPoint:NSMakePoint(i * 10 - 0.5, 0) toPoint:NSMakePoint(i * 10 - 0.5, [self bounds].size.height)];
}

}

グリッド

于 2013-04-19T22:52:52.913 に答える
2

ここでは、特に線を変える必要があるため、パターンの色は良い解決策ではないと思います。代わりに、水平線と垂直線ごとに NSBezierPath と moveToPoint/lineToPoint のペアを使用します。その後、1 回の呼び出しでグリッドを描画できます。色 (アルファ) や幅が異なる線に対して追加の手順を実行します (つまり、太い線をメイン グリッド パスに追加せずに、別の線を作成します)。

于 2013-04-05T07:50:02.493 に答える
1

すべての Xcode インストールに付属するか、個別のダウンロードとしても利用できるSketch の例を見てください。

ズームなどを可能にするグリッド実装 (および Cocoa テクニックの他の多くの有用なデモ..) を備えています。

于 2013-04-05T07:50:40.883 に答える
1

「sad tuna」と同じですが、Swift 3で

override func drawRect(dirtyRect: NSRect) {
    super.drawRect(dirtyRect)
    if let context = NSGraphicsContext.currentContext()?.CGContext {
        NSColor.whiteColor().setFill()
        CGContextFillRect(context, dirtyRect)
        CGContextFlush(context)
    }

    for i in 1...(Int(self.bounds.size.height) / 10) {
        if i % 10 == 0 {
            NSColor(SRGBRed: 100/255.0, green: 149/255.0, blue: 237/255.0, alpha: 0.3).set()
        }else if i % 5 == 0 {
            NSColor(SRGBRed: 100/255.0, green: 149/255.0, blue: 237/255.0, alpha: 0.2).set()
        }else{
            NSColor(SRGBRed: 100/255.0, green: 149/255.0, blue: 237/255.0, alpha: 0.1).set()
        }

        NSBezierPath.strokeLineFromPoint(CGPointMake(0, CGFloat(i) * 10 - 0.5), toPoint: CGPointMake(self.bounds.size.width, CGFloat(i) * 10 - 0.5))
    }

    for i in 1...(Int(self.bounds.size.width) / 10) {
        if i % 10 == 0 {
            NSColor(SRGBRed: 100/255.0, green: 149/255.0, blue: 237/255.0, alpha: 0.3).set()
        }else if i % 5 == 0 {
            NSColor(SRGBRed: 100/255.0, green: 149/255.0, blue: 237/255.0, alpha: 0.2).set()
        }else{
            NSColor(SRGBRed: 100/255.0, green: 149/255.0, blue: 237/255.0, alpha: 0.1).set()
        }

        NSBezierPath.strokeLineFromPoint(CGPointMake(CGFloat(i) * 10 - 0.5, 0), toPoint: CGPointMake(CGFloat(i) * 10 - 0.5, self.bounds.size.height))
    }
}
于 2016-08-24T15:13:57.453 に答える
1

MacOS 10.10 以降で、Methanol のソリューションを迅速に移植し、エラーを解決します。

単純な静的関数を使用して、drawRect() から呼び出すことができます。

static func makeGridBackground(dirtyRect: NSRect, view: NSView){
    //view.print("WMEditorUtils: initiated drawing")

    //Fill background with white color
    if let context = NSGraphicsContext.currentContext()?.CGContext {
        NSColor.whiteColor().setFill()
        CGContextFillRect(context, dirtyRect)
        CGContextFlush(context)
    }

    //Draw Lines: Horizontal
    for var i:Int = 1; i < (Int)(view.bounds.size.height / 10); i++ {
        if (i % 10 == 0) {
            NSColor(deviceRed: 100.0/255.0, green: 149.0/255.0, blue: 237.0/255.0, alpha: 0.3).set()
        }
        else if (i % 5 == 0) {
            NSColor(deviceRed: 100.0/255.0, green: 149.0/255.0, blue: 237.0/255.0, alpha: 0.2).set()
        }
        else{
            NSColor(deviceRed: 100.0/255.0, green: 149.0/255.0, blue: 237.0/255.0, alpha: 0.1).set()
        }
        NSBezierPath.strokeLineFromPoint(NSMakePoint(0, (CGFloat)(i * 10) - 0.5), toPoint: NSMakePoint(view.bounds.size.width, (CGFloat)(i * 10) - 0.5))
    }

    //Draw Lines: Vertical
    for var i:Int = 1; i < (Int)(view.bounds.size.width / 10); i++ {
        if (i % 10 == 0) {
            NSColor(deviceRed: 100.0/255.0, green: 149.0/255.0, blue: 237.0/255.0, alpha: 0.3).set()
        }
        else if (i % 5 == 0) {
            NSColor(deviceRed: 100.0/255.0, green: 149.0/255.0, blue: 237.0/255.0, alpha: 0.2).set()
        }
        else{
            NSColor(deviceRed: 100.0/255.0, green: 149.0/255.0, blue: 237.0/255.0, alpha: 0.1).set()
        }
        NSBezierPath.strokeLineFromPoint(NSMakePoint((CGFloat)(i * 10) - 0.5, 0), toPoint: NSMakePoint((CGFloat)(i * 10) - 0.5, view.bounds.size.width))
    }

}
于 2015-10-26T06:46:23.303 に答える