   // MARK: Draw
 
   private func draw() {
-    let fretSize = CGSize(
-      width: frame.size.width / CGFloat(fretboard.direction == .horizontal ? fretboard.count : fretboard.tuning.strings.count),
-      height: frame.size.height / CGFloat(fretboard.direction == .horizontal ? fretboard.tuning.strings.count: fretboard.count))
-
+    let gridWidth = frame.size.width / (CGFloat(fretboard.direction == .horizontal ? fretboard.count : fretboard.tuning.strings.count) + 0.5)
+    let gridHeight = frame.size.height / (CGFloat(fretboard.direction == .horizontal ? fretboard.tuning.strings.count: fretboard.count) + 0.5)
+
+    // String label size
+    var stringLabelSize = CGSize()
+    if isDrawStringName {
+      let horizontalSize = CGSize(
+        width: gridWidth / 2,
+        height: gridHeight)
+
+      let verticalSize = CGSize(
+        width: gridWidth,
+        height: gridHeight / 2)
+
+      stringLabelSize = fretboard.direction == .horizontal ? horizontalSize : verticalSize
+    }
+
+    // Fret label size
+    var fretLabelSize = CGSize()
+    if isDrawFretNumber {
+      let horizontalSize = CGSize(
+        width: (frame.size.width - stringLabelSize.width) / CGFloat(fretboard.direction == .horizontal ? fretboard.count : fretboard.tuning.strings.count),
+        height: gridHeight / 2)
+
+      let verticalSize = CGSize(
+        width: gridWidth / 2,
+        height: (frame.size.height - stringLabelSize.height) / CGFloat(fretboard.direction == .horizontal ? fretboard.tuning.strings.count : fretboard.count))
+
+      fretLabelSize = fretboard.direction == .horizontal ? horizontalSize : verticalSize
+    }
+
+    // Fret view size
+    let horizontalSize = CGSize(
+      width: (frame.size.width - stringLabelSize.width) / CGFloat(fretboard.count),
+      height: (frame.size.height - fretLabelSize.height) / CGFloat(fretboard.tuning.strings.count))
+
+    let verticalSize = CGSize(
+      width: (frame.size.width - fretLabelSize.width) / CGFloat(fretboard.tuning.strings.count),
+      height: (frame.size.height - stringLabelSize.height) / CGFloat(fretboard.count))
+
+    var fretSize = fretboard.direction == .horizontal ? horizontalSize : verticalSize
+
+    // Layout string labels
+    for (index, label) in stringLabels.enumerated() {
+      var position = CGPoint()
+      switch fretboard.direction {
+      case .horizontal:
+        #if os(iOS) || os(tvOS)
+          position.y = stringLabelSize.height * CGFloat(index)
+        #elseif os(OSX)
+          position.y = frame.size.height - stringLabelSize.height - (stringLabelSize.height * CGFloat(index))
+        #endif
+      case .vertical:
+        position.x = stringLabelSize.width * CGFloat(index) + fretLabelSize.width
+        position.y = frame.size.height - stringLabelSize.height
+      }
+
+      label.textLayer.string = NSAttributedString(
+        string: "\(fretboard.tuning.strings[index].type)",
+        attributes: [
+          NSForegroundColorAttributeName: stringLabelColor,
+          NSFontNameAttribute: FRFont.systemFont(ofSize: min(stringLabelSize.width, stringLabelSize.height))
+        ])
+      label.frame = CGRect(origin: position, size: stringLabelSize)
+    }
+
+    // Layout fret labels
+    for (index, label) in fretLabels.enumerated() {
+      var position = CGPoint()
+      switch fretboard.direction {
+      case .horizontal:
+        position.x = (fretLabelSize.width * CGFloat(index)) + stringLabelSize.width
+        #if os(iOS) || os(tvOS)
+          position.y = frame.size.height - fretLabelSize.height
+        #endif
+      case .vertical:
+        #if os(iOS) || os(tvOS)
+          position.y = fretLabelSize.height * CGFloat(index) + stringLabelSize.height
+        #elseif os(OSX)
+          position.y = frame.size.height - fretLabelSize.height - (fretLabelSize.height * CGFloat(index)) - stringLabelSize.height
+        #endif
+      }
+
+      label.textLayer.string = NSAttributedString(
+        string: "\(fretboard.startIndex + index)",
+        attributes: [
+          NSForegroundColorAttributeName: fretLabelColor,
+          NSFontNameAttribute: FRFont.systemFont(ofSize: min(fretLabelSize.width, fretLabelSize.height))
+        ])
+      label.frame = CGRect(origin: position, size: fretLabelSize)
+    }
+
+    // Layout fret views
     for (index, fret) in fretViews.enumerated() {
       let fretIndex = fret.note.fretIndex
       let stringIndex = fret.note.stringIndex
+
+      // Make 0th fret half of fret size because it is open string.
+      if fretboard.startIndex == 0, index == 0 {
+        switch fretboard.direction {
+        case .horizontal: fretSize.width = fretSize.width / 2
+        case .vertical: fretSize.height = fretSize.height / 2
+        }
+      }
 
       // Position
       var position = CGPoint()
       switch fretboard.direction {
       case .horizontal:
         #if os(iOS) || os(tvOS)
-          position.x = fretSize.width * CGFloat(fretIndex)
+          position.x = fretSize.width * CGFloat(fretIndex) + stringLabelSize.width
           position.y = fretSize.height * CGFloat(stringIndex)
         #elseif os(OSX)
-          position.x = fretSize.width * CGFloat(fretIndex)
+          position.x = fretSize.width * CGFloat(fretIndex) + stringLabelSize.width
           position.y = frame.size.height - fretSize.height - (fretSize.height * CGFloat(stringIndex))
         #endif
       case .vertical:
         #if os(iOS) || os(tvOS)
-          position.x = fretSize.width * CGFloat(stringIndex)
-          position.y = fretSize.height * CGFloat(fretIndex)
+          position.x = fretSize.width * CGFloat(stringIndex) + fretLabelSize.width
+          position.y = fretSize.height * CGFloat(fretIndex) + stringLabelSize.height
         #elseif os(OSX)
-          position.x = fretSize.width * CGFloat(stringIndex)
-          position.y = frame.size.height - fretSize.height - (fretSize.height * CGFloat(fretIndex))
+          position.x = fretSize.width * CGFloat(stringIndex) + fretLabelSize.width
+          position.y = frame.size.height - fretSize.height - (fretSize.height * CGFloat(fretIndex)) - stringLabelSize.height
         #endif
       }
 

  }
}

// MARK: - FretView

public enum FretNoteType {

  public var fretboard = Fretboard()

  @IBInspectable public var isDrawNoteName: Bool = true { didSet { redraw() }}
  @IBInspectable public var isDrawStringName: Bool = true { didSet { redraw() }}
  @IBInspectable public var isDrawFretNumber: Bool = true { didSet { redraw() }}
  @IBInspectable public var isChordModeOn: Bool = false { didSet { redraw() }}
  @IBInspectable public var fretWidth: CGFloat = 5 { didSet { redraw() }}
