개발/Swift

Swift Tooltip 구현하는 방법

덤벨로퍼 2023. 5. 21. 15:59

Modern Collection View 와 MVVM 패턴 가이드

 

[iOS] Modern Collection View & MVVM 패턴 가이드 - 인프런 | 강의

MVVM 패턴과 Modern Collection View를 사용해 네트워킹을 구현하고, 다양하고 동적인 Collection View를 자유자재로 다룰 수 있게 됩니다., - 강의 소개 | 인프런

www.inflearn.com

이런거를 구현해야했다.

텍스트, 둥근 오렌지색 배경은 문제 없이 구현 가능하나

문제는 밑에 달린 뾰족한 부분(Tip) 을 직접 그려내야 한다는것이다.

 

그리는 방법은 우선 4개의 점을 지정해줘서

점을 이은 4각형의 (정확히는 마름모) 레이어를 만들어

배경색을 넣어주고 해당 View 레이어에 넣어줘야 한다.

 

4개의 지점을 지정하는 방법은

마름모의 꼭지점 CGPoint 를 지정해주는데

Start 할 위치 - 가장 왼쪽 ( 위 그림에서 ”인” 아래)

2번째 위치 - 가장 위쪽

3번쨰 - 가장 오른쪽 (2 아래)

4번쨰 가장 밑쪽 (Tip 끝부분)

private func drawTip(tipStartX: CGFloat, tipStartY: CGFloat,
                             tipWidth: CGFloat, tipHeight: CGFloat) {
            let path = CGMutablePath()

            let tipWidthCenter = tipWidth / 2.0
            let tipHeightCenter = tipHeight / 2.0

            path.move(to: CGPoint(x: tipStartX, y: tipStartY))
            path.addLine(to: CGPoint(x: tipStartX + tipWidthCenter, y: tipStartY + tipHeightCenter))
            path.addLine(to: CGPoint(x: tipStartX + tipWidth, y: tipStartY))
            path.addLine(to: CGPoint(x: tipStartX + tipWidthCenter, y: tipStartY - tipHeightCenter))

            let shape = CAShapeLayer()
            shape.path = path
            shape.fillColor = UIColor.orange500.cgColor
            layer.insertSublayer(shape, at: 0)
        }

tipStartX ,tipStartY 에 Start할 위치 를 지정하려면

전체 툴팁 View에서 Start할 포인트 ( "인" 아래에 지점 ) 을 지정해주고 거기서부터

move() addLine()을 통해 순차적으로 넣어준다.

또 원하는 크기의 tipWidth, tipHeight 를 넣어주면 된다.

 

예를 들어 2번째 포인트는 가로축 가운데 + 세로축 가장 위를 의미한다.

가로축 = start.x 에 Tip의 너비 반만큼 크기를 더해줬다.

세로축 = start.y + tip 높이 반만큼 더해줬다.

그래야 가로축 가운데의 세로축 가장 위쪽이 잡힌다.

 

나머지 포인트도 그렇게 그려주면 된다.