2013-04-04 22 views
1

有没有简单的方法来获得这个网格背景?或者我必须这样做[NSColor colorWithPatternImage:[NSImage ...]]如何为NSView制作网格背景图案?

Screenshot of interface

我不想完整的代码。我只想知道是否有一个简单的方法来做到这一点,如果是的话。

+0

不适用于mac,但适用于iOS,但它可能会开始:[适用于iOS开发人员的实用绘图](https://developer.apple.com/videos/wwdc/2011/?id=129) – vikingosegundo 2013-04-04 22:16:35

+0

@methanol,有没有答案给你什么你想知道?如果是这样,请接受该答案以允许为其分配点数。 – 2013-04-15 13:31:45

+0

@MikeLischke如果你的意思是“积分”,那么声誉是 - 我已经做到了。我提出了两个答案。没有一个是我正在寻找的。 – tuna 2013-04-15 19:48:01

回答

1

我不认为图案颜色是一个很好的解决方案,特别是因为你需要改变线条。对每条水平线和垂直线使用NSBezierPath和moveToPoint/lineToPoint对。然后您可以在一次通话中绘制网格。为具有不同颜色(阿尔法)和/或宽度的线条执行额外的步骤(即,不要将较粗的线条添加到主网格路径,而是为它们创建单独的线条)。

+0

这是变化的线宽不是一个问题,真的。您只需将图案制成大(厚)框中的一种,而不是其中一个小框。由于这些方块可能会重复出现,所以这可能比Quartz实际计算和消除所有行的混淆更耗费CPU资源。 – uliwitness 2014-03-08 13:13:10

1

只需看看每个Xcode安装附带的the Sketch example,或者也可以单独下载。

,设有电网实现(和可可技术的许多其他有用的示威游行..)允许缩放等

4

这是我的解决方案:

- (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)]; 
} 

} 

Grid

1

移植甲醇的解决方案以迅速解决MacOS 10.10以上的错误。

一个简单的静态函数可以用来从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)) 
    } 

} 
1

相同的 “悲伤金枪鱼”,但在夫特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)) 
    } 
} 
0

相同的,但对于夫特4

override func draw(_ dirtyRect: NSRect) { 
    super.draw(dirtyRect) 

    if let context = NSGraphicsContext.current?.cgContext { 
     NSColor.white.setFill() 
     context.fill(dirtyRect) 
     context.flush() 
    } 

    for i in 1...(Int(self.bounds.size.height)/10) { 
     if i % 10 == 0 { 
      NSColor.init(red: 100/255.0, green: 149/255.0, blue: 237/255.0, alpha: 0.3).set() 
     }else if i % 5 == 0 { 
      NSColor.init(red: 100/255.0, green: 149/255.0, blue: 237/255.0, alpha: 0.2).set() 
     }else{ 
      NSColor.init(red: 100/255.0, green: 149/255.0, blue: 237/255.0, alpha: 0.1).set() 
     }    
     NSBezierPath.strokeLine(from: CGPoint(x: 0, y: CGFloat(i) * 10 - 0.5), to: CGPoint(x: self.bounds.size.width, y: CGFloat(i) * 10 - 0.5)) 
    } 

    for i in 1...(Int(self.bounds.size.width)/10) { 
     if i % 10 == 0 { 
      NSColor.init(red: 100/255.0, green: 149/255.0, blue: 237/255.0, alpha: 0.3).set() 
     }else if i % 5 == 0 { 
      NSColor.init(red: 100/255.0, green: 149/255.0, blue: 237/255.0, alpha: 0.2).set() 
     }else{ 
      NSColor.init(red: 100/255.0, green: 149/255.0, blue: 237/255.0, alpha: 0.1).set() 
     } 
     NSBezierPath.strokeLine(from: CGPoint(x: CGFloat(i) * 10 - 0.5, y:0), to: CGPoint(x: CGFloat(i) * 10 - 0.5, y: self.bounds.size.height)) 
    } 
}