All Projects → kaishin → Thyme

kaishin / Thyme

Licence: other
A functional, descriptive, and more modern CoreGraphics wrapper for iOS/OS X.

Programming Languages

swift
15916 projects
ruby
36898 projects - #4 most used programming language
objective c
16641 projects - #2 most used programming language
shell
77523 projects

logo

Thyme

GitHub release Carthage compatible CocoaPods Swift 4.0 platforms

A thin wrapper around Core Graphics that makes it possible to reuse the same drawing code on both iOS and macOS.

Installation

Carthage

  • Add the following to your Cartfile: github "kaishin/Thyme"
  • Then run carthage update
  • Follow the current instructions in Carthage's README for up to date installation instructions.

CocoaPods

  • Add the following to your Podfile: pod 'Thyme'
  • You will also need to make sure you're opting into using frameworks: use_frameworks!
  • Then run pod install.

Usage

After importing Thyme, you can use the same APIs on both iOS and OSX. The exact same drawing code can be used in both platforms.

Thyme introduces the Path type to help you contruct your paths. Instead of providing exact coordinates, you describe how your path can be drawn in a series of actions. For instance:

let square = Path(point: CGPointZero)
  .addLine(towards: [.Right: 100])
  .addLine(towards: [.Bottom: 100])
  .addLine(towards: [.Left: 100])
  .addLine(towards: [.Top: 100])
  .close()

The code snippet above describes a square-shaped path in 5 steps. You can then obtain a CGPathRef using the CGPath property of Path.

This is a simplified example to demonstrate how you can use the same drawing code on both platforms, with the use of helpers such as CGRect.topLeftPoint:

// Shared Code
func drawIcon(context: CGContextRef, rect: CGRect, fillColor: CGColorRef) {
  let triangle = Path(point: rect.topLeftPoint)
    .addLine(to: rect.topRightPoint)
    .addLine(towards: [.left: rect.width / 2, .bottom: rect.height])
    .close()

  context.addPath(triangle.cgPath)
  context.setFillColor(fillColor)
  context.fillPath()
}

// iOS
class CustomView: UIView {
  override func drawRect(rect: CGRect) {
    drawInCurrentContext { context in
      drawIcon(context, rect: self.bounds, fillColor: UIColor.redColor())
    }
  }
}

// Mac
class CustomView: NSView {
  override func drawRect(dirtyRect: NSRect) {
    drawInCurrentContext { context in
      drawIcon(context, rect: self.bounds, fillColor: NSColor.redColor())
    }
  }
}

Requirements

  • Swift 4.0+
  • Xcode 9
  • iOS 10+
  • macOS 10.10+

License

Copyright 2015-2018 Reda Lemeden. BSD Licence. See LICENSE file for more info.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].