С Quartz в Какао OSX и iOS, как вы рисуете линии и «соединяете» формы? - PullRequest
0 голосов
/ 05 февраля 2012

Используя Objective C и смесь Какао и Кварца, возможно ли создать что-то вроде Visio? Специально для:

  1. Нарисуйте линию от одного объекта к другому,
  2. подключите его и "закрепите" на втором объекте с помощью цветного квадрата со стрелкой на любом конце линии и
  3. оставьте линию подключенной, если вы перетаскиваете объекты.

Ответы [ 2 ]

3 голосов
/ 06 февраля 2012

вы хотите NSBezierPath на OSX и UIBezierPath на iOS. используя OSX в качестве примера, чтобы нарисовать линию от A до B (где A & B - точки NSP) в NSView:

- (void)drawRect:(NSRect)dirtyRect {
  NSBezierPath *path = [NSBezierPath bezierPath];
  [path moveToPoint:A];
  [path lineToPoint:B];
  [path stroke];
}

если вы хотите нарисовать прямоугольник, представленный NSRect r, вы должны сделать:

NSBezierPath *path = [NSBezierPath bezierPathWithRect:r];
[path stroke];

и т.д.. Есть множество вещей, которые вы можете сделать.

Что касается отслеживания подключений, это то, что вы должны обрабатывать самостоятельно (т.е. не то, что предоставляется OSX / iOS).

0 голосов
/ 28 января 2018

мои два цента для OSX && swift 4.x (проверено на Xcode 9.1)

//  CustomView.swift
//  cocoaCustomDraw
//
//  Created by ing.conti on 1/28/18.
//  Copyright © 2018 ing.conti. All rights reserved.
//

import Cocoa

class CustomView: NSView {

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

        // Drawing code here.

        // https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CocoaDrawingGuide/Introduction/Introduction.html

        guard let aContext = NSGraphicsContext.current else{
            return
        }

        // eventually..
        aContext.saveGraphicsState()

        // Set the drawing attributes

        // Draw the object
        NSColor.blue.set()
        NSColor.yellow.setFill()

        // https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CocoaDrawingGuide/Paths/Paths.html

        let aPath = NSBezierPath()
        aPath.move(to: NSPoint(x: 0, y: 0))
        aPath.line(to: NSPoint(x: 100, y: 100))

        aPath.curve(to: NSPoint(x:180, y: 210),
        controlPoint1: NSPoint(x: 60, y: 20),
        controlPoint2: NSPoint(x: 280, y: 100))

        //aPath.appendRect( NSRect(x: 2.0, y: 16.0, width:  8.0,  height: 5.0))

        aPath.close()

        aPath.fill()
        aPath.stroke()


        // eventually..
        aContext.restoreGraphicsState()
    }   
}

Вы получите:

enter image description here

...