---
# System prepended metadata

title: '✏️ 17주차 \[8기\] B반 스터디'
tags: [toyo]

---

# ✏️ 17주차 \[8기\] B반 스터디

## 🗓2023-05-13

**참여자** : 리지, vetto, 송준

**진행자** : vetto

  
## \[금주의 실험🔥\] CoreAnimations

### 👨‍🔬 실험 1: Layer Based Drawing 해보기

<img src ="https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/resources/usr/6131c8fa2e11413823f8dd7f/20220225/621887f4536b5e1551d11266.png" width="300">

- 아래가 볼록한 모양의 컵이 있습니다.
- 컵에는 음료가 담길 수 있습니다.
- 컵 안에는 빨대가 하나 들어있습니다.

### 트러블 슈팅

- 컵 바닥 호 그리기
```swift
path.addQuadCurve(to: , controlPoint: )
```
addQuadCurve를 활용해 to에 끝지점, controlPoint에 중간 지점을 넣어 그려줌
[계산해주는 사이트](https://www.desmos.com/calculator/lvdgnyhkvy?lang=ko)

- 빨대 끝 부분 동그랗게 그리기
`path.lineCapStyle` 에 round 값을 주어도 layer의 값이 변하지 않는 문제가 있었는데, path에 주는것이 아니라 layer 자체의 lineCap 스타일을 변화시키니 정상적으로 작동하였음.

```swift
let path = UIBezierPath()
path.lineWidth = 15
strawLayer.lineWidth = path.lineWidth
strawLayer.lineCap = .round
```

- Mask
어떤 부분을 제외하고 보여주고 싶을 때, 그 부분을 투명처리해서 가리고 보여줄 수 있게 사용할 수 있는 Layer 계층

   - 컵 path와 동일하게 구현
   - drinksLayer.mask에 넣어줌
   - mask의 path 값을 조절하여 음료 양 조절


## 개인 작품

### 송준
<details><summary>소스코드</summary>
    
```swift
func makeCupPath() {
        let cupPath = UIBezierPath()
        
        cupPath.move(to: CGPoint(x: width * 0.15, y: height * 0.15))
        cupPath.addLine(to: CGPoint(x: width * 0.35, y: height * 0.75))
        cupPath.stroke()
        
        cupPath.move(to: CGPoint(x: width * 0.85, y: height * 0.15))
        cupPath.addLine(to: CGPoint(x: width * 0.65, y: height * 0.75))
        cupPath.stroke()
        
        cupPath.addQuadCurve(to: CGPoint(x: width * 0.35, y: height * 0.75),
                             controlPoint: CGPoint(x: width * 0.5, y: height * 0.825))
        cupPath.stroke()
        
        self.layer.addSublayer(cupShapeLayer)
        cupShapeLayer.path = cupPath.cgPath
    }
```
:fire: `addQuadCurve`메서드를 사용할 경우 `to` 부분에 시작점을 넣지 않고 끝나는 지점을 넣어줘야 한다. (addLine도 마찬가지) 
</details>


### vetto

<details>
    <summary>소스코드</summary></summary>
    
```swift
func drawCup() {
    let cupPath = UIBezierPath()
        
    cupPath.move(to: CGPoint(x: 180, y: 200))
    cupPath.addLine(to: CGPoint(x: 200, y: 350))
    cupPath.addLine(to: CGPoint(x: 240, y: 350))
    cupPath.addLine(to: CGPoint(x: 260, y: 200))
    cupPath.stroke()
        
    cupLayer.frame = self.view.frame
    cupLayer.path = cupPath.cgPath
    cupLayer.strokeColor = UIColor.lightGray.cgColor
    cupLayer.fillColor = UIColor.clear.cgColor
    cupLayer.lineWidth = 10
    self.view.layer.addSublayer(cupLayer)
}

func drawStraw() {
    let strawPath = UIBezierPath()
        
    strawPath.lineCapStyle = .round
    strawPath.move(to: CGPoint(x: 220, y: 340))
    strawPath.addLine(to: CGPoint(x: 250, y: 190))
    strawPath.addLine(to: CGPoint(x: 270, y: 160))
    strawPath.stroke()
        
    strawLayer.frame = self.view.frame
    strawLayer.path = strawPath.cgPath
    strawLayer.strokeColor = UIColor.darkGray.cgColor
    strawLayer.fillColor = UIColor.clear.cgColor
    strawLayer.lineWidth = 10
    self.view.layer.addSublayer(strawLayer)
}
```
</details>



### 리지


<details>
    <summary>소스 코드</summary></summary>
    
```swift
final class DrinksView: UIView {
    
    let edgeOfCupsLayer = CAShapeLayer()
    let strawLayer = CAShapeLayer()
    let drinksLayer = CAShapeLayer()
    let maskingLayer = CAShapeLayer()

    func makeCup() {
        let path = UIBezierPath()
        path.lineWidth = 15
        
        path.move(to: CGPoint(x: 100, y: 200))
        path.addLine(to: CGPoint(x: 130, y: 500))
        path.addQuadCurve(to: CGPoint(x: 250, y: 500), controlPoint: CGPoint(x: 190, y: 515.6))
        path.addLine(to: CGPoint(x: 280, y: 200))
        
        edgeOfCupsLayer.strokeColor = UIColor.systemGray4.cgColor
        edgeOfCupsLayer.fillColor = UIColor.clear.cgColor
        edgeOfCupsLayer.lineWidth = path.lineWidth
        
        self.layer.addSublayer(edgeOfCupsLayer)
        edgeOfCupsLayer.path = path.cgPath

    }
    
    func makeStraw() {
        let path = UIBezierPath()
        path.lineWidth = 10
        
        path.move(to: CGPoint(x: 340, y: 120))
        path.addLine(to: CGPoint(x: 250, y: 210))
        path.addLine(to: CGPoint(x: 150, y: 480))
        
        strawLayer.strokeColor = UIColor.gray.cgColor
        strawLayer.fillColor = UIColor.clear.cgColor
        strawLayer.lineWidth = path.lineWidth
        strawLayer.lineCap = .round
        
        self.layer.addSublayer(strawLayer)
        strawLayer.path = path.cgPath
        
    }
    
    func makeMasking() {
        let path = UIBezierPath()
    
        path.move(to: CGPoint(x: 100, y: 300))
        path.addLine(to: CGPoint(x: 130, y: 500))
        path.addQuadCurve(to: CGPoint(x: 250, y: 500), controlPoint: CGPoint(x: 190, y: 515.6))
        path.addLine(to: CGPoint(x: 280, y: 300))
       
        maskingLayer.path = path.cgPath
        drinksLayer.mask = maskingLayer
    }
    
    func makeDrinks() {
        let path = UIBezierPath()
    
        path.move(to: CGPoint(x: 100, y: 200))
        path.addLine(to: CGPoint(x: 130, y: 500))
        path.addQuadCurve(to: CGPoint(x: 250, y: 500), controlPoint: CGPoint(x: 190, y: 515.6))
        path.addLine(to: CGPoint(x: 280, y: 200))
        
        drinksLayer.strokeColor = UIColor.clear.cgColor
        drinksLayer.fillColor = UIColor.brown.cgColor
        
        self.layer.addSublayer(drinksLayer)
        drinksLayer.path = path.cgPath
    }

}
class ViewController: UIViewController {
    
    let drinkView = DrinksView()

    override func viewDidLoad() {
        super.viewDidLoad()
       
        view.addSubview(drinkView)
        drinkView.makeCup()
        drinkView.makeStraw()
        drinkView.makeMasking()
        drinkView.makeDrinks()
    }
}
```
</details>
    
###### tags: `toyo`