별점주기

Judy·2021년 6월 9일
0

우선 저번 목표였던 Storage에 올린 이미지 삭제하기

storage.reference().child(removePlace).delete { error in
	if let error = error {
		print("Error removing image: \(error)")
	} else {
		print("Image successfully removed!")
	}
}

이미지를 가리키는 경로에 .delete만 하면 쉽게 해결!

별점주기

장소에 대한 점수를 주는게 필요하다.
그냥 숫자를 입력하거나 Picker로 해도 되지만 ⭐️ 로 표현하고 싶어서 라이브러리를 쓸까 하다가 만들 수 있을거 같아 시도해봤다.

0점에서 5점 기준으로 별모양으로 버튼 다섯개를 만들었다.

AddRate 클래스를 만들고

var buttonState = [Bool]()
    
    init() {
        for _ in 0...4{
            buttonState.append(false)
        }
    }

버튼이 눌렸는지 상태를 저장하는 배열을 만들고 모두 false로 초기화해줬다.

  • false에서 버튼 클릭 -> ⭐️ 반개
  • true에서 버튼 클릭 -> 🌟 채워진 별

빈 별모양에서 버튼 클릭 시 반개와 꽉 채운 별을 반복하도록 했다.

선택한 버튼에 따라 별모양 선택

private func rateFill(buttons: [UIButton], index: Int){
	if buttonState[index] == false{
            buttons[index].setImage(UIImage(systemName: "star.leadinghalf.fill"), for: .normal)
            buttonState[index] = true            
        }
        else{
            buttons[index].setImage(UIImage(systemName: "star.fill"), for: .normal)
            buttonState[index] = false
        }
        fillStar(buttons: buttons, index: index)
        clearStar(buttons: buttons, index: index)
    }

버튼 다섯개가 들어간 배열과 인덱스를 받아 상태에 따라 선택한 버튼의 모양을 결정하고 선택한 이전 별들은 채우고, 뒤에 별들은 비워준다.

채우기 함수

private func fillStar(buttons: [UIButton], index: Int){
	var i = 0
	while i < index {
            buttons[i].setImage(UIImage(systemName: "star.fill"), for: .normal)
            buttonState[i] = false
            i = i + 1
        }
    }

비우기 함수

private func clearStar(buttons: [UIButton], index: Int){
	var i = 4
	while i > index {
            buttons[i].setImage(UIImage(systemName: "star"), for: .normal)
            buttonState[i] = true
            i = i - 1
        }
    }

모든 함수를 이용하려면 선택한 버튼이 몇번째인지 알아야 하므로 인덱스 번호를 찾는 함수를 만들고 채우기 함수를 호출하도록 했다.

선택한 버튼의 인덱스 번호 찾기

func checkAttr(buttons: [UIButton], button: UIButton) -> Float{
	var i = 0
	while button != buttons[i] {
            i = i + 1
        }
        rateFill(buttons: buttons, index: i)
        
        if buttonState[i] == true {
            return Float(i) + 0.5
        }else{
            return Float(i) + 1.0
        }
    }
  • 선택한 버튼의 인덱스가 true면 false에서 눌린 것으로 현재 별 반개
    -> +0.5점
    ex) 3번째 버튼 = 2(인덱스 번호) + 0.5 = 2.5점 🌟🌟⭐️

  • 선택한 버튼의 인덱스가 false면 ture에서 눌린 것으로 현재 별 채움
    -> +1점
    ex) 3번째 버튼 = 2(인덱스 번호) + 1 = 3점 🌟🌟🌟

장소 추가하는 뷰에서 AddRate 함수를 이용하면 별점주기 완성!

let rate = AddRate()

@IBAction func clickStar(_ sender: UIButton){
	lblRate.text = String(describing: rate.checkAttr(buttons: rateButtons, button: sender))
    }

# 소감 #

처음으로 생각한대로 된거 같다 ☺️ 물론 한 번에 원하는 별이 안돼서 아쉽지만 이정도면 만족!

다음 목표

장소 정보 수정하기

profile
iOS Developer

0개의 댓글