커스텀 뷰로 만든 UI 컴포넌트의 포커스링 그리기 – Cocoa
포커스 링
코코아 UI 요소에서 현재 포커스를 받은 UI 컴포넌트는 외부에 흐릿한 푸른 색 후광이 그려지며, 현재 포커스를 받고 있는 입력 디바이스라는 점을 시각적으로 피드백한다. 시중의 코코아 관련한 대부분의 책에서는 다음과 같이 draw:
메소드 내에서 포커스링을 그리는 것으로 포커스링을 흉내낼 수 있다고 한다. 1
override func draw(_ dirtyRect: NSRect) {
// 배경을 칠하고,
super.draw(dirtyRect)
self.bgColor.set()
NSBezierPath.fill(bounds)
// 자신이 속한 윈도에서 자기가 제1응답자라면?
if let fr = window?.firstResponder, fr === self {
// 포커스 컬러로 세팅하여, 자신의 테두리 영역을 그린다.
NSColor.keyboardFocusIndicatorColor.set()
NSBezierPath.setDefaultLineWidth(4.0)
NSBezierPath.strokeRect(bounds)
}
}
그리고 제 1 응답자가 되었을 때 포커스링을 그리기 위해서는 뷰가 응답자 상태에 진입하거나 빠져나올 때마다 뷰를 새로 그리도록 갱신해야 한다.
override var acceptsFirstResponder: Bool { return true }
override func resignFirstResponder() -> Bool {
NSLog("Resigning...")
setNeedsDisplay(bounds)
return true
}
override func becomeFirstResponder() -> Bool {
NSLog("Becoming...")
setNeedsDisplay(bounds)
return true
}