야금야금 고치기

Judy·2021년 9월 18일
0

별점 버튼 슬라이드와 터치

1. Slider

장소의 별점을 주는 버튼을 만들어서 사용했었다.

버튼을 누를 때마다 반별에서 풀별로 바뀌는 것을 기반으로 만들었는데 아무래도 드래그가 안되고 몇 번씩 눌러야 해서 불편했다.

라이브러리를 사용해야 하나 하다 알아보니 슬라이드 기능은 Slider를 이미지와 겹쳐서 Slider 값에 따라 이미지를 바꾸는 방식임을 알게 됐다.
이미지를 사용하기 본단 버튼을 이용했던 방식을 이용하여 내가 만든 별점에 적용해봤다.

public func sliderStar(buttons: [UIButton], rate: Float){
        let rateDown = rate.rounded(.down)
        let half = rate - rateDown
        let rateInt = Int(rateDown)
        
        fillStar(buttons: buttons, index: rateInt)
        clearStar(buttons: buttons, index: rateInt)
        
        if half >= 0.5{
            buttons[rateInt].setImage(UIImage(systemName: "star.leadinghalf.fill"), for: .normal)
        }else{
            if rateInt != 5{
                buttons[rateInt].setImage(UIImage(systemName: "star"), for: .normal)}
        }
    }

slider의 값을 0에서 5로 하고 정수와 소수점 이하를 분리하여

소수점 이하 >= 0.5 : 정수 + 반별 채우기
소수접 이하 < 0.5 : 정수만 채우기

이런 매커니즘을 적용했다.

참고로 float에서 소수점을 내리는 것은 아래의 함수를 이용하면 된다.

FLOAT.rounded(.down)

2. Touch

별점에 Slider를 넣으니 계속 드래그를 통해 별점을 줘야 한다는 단점이 생겼다.
편하게 별점을 주기 위해선 터치한 위치를 기반으로 별점을 줄 수도 있어야 했다.

class StarRatingUISlider: UISlider {

    override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
        let width = self.frame.size.width
        let tapPoint = touch.location(in: self)
        let fPercent = tapPoint.x/width
        let nNewValue = self.maximumValue * Float(fPercent)
        if nNewValue != self.value {
            self.value = nNewValue
        }
        return true
    }
}

UISlider에 터치 이벤트를 넣고 Slider의 class를 StarRatingUISlider로 변경하면 된다.

카테고리 수정

분류와 그룹을 삭제와 삽입할 수 있는데 제약을 두지 않아 어떤 항목도 삭제, 삽입이 가능했다.

1. 삭제

이미 장소가 사용하고 있는 분류와 그룹을 삭제하면 오류가 발생하므로 삭제하기 전에 사용되고 있는지 확인할 필요가 있었다.

사용되고 있는 분류나 그룹인지 확인하는 함수

func checkItem(item: String) -> Bool{
    if editType == "items"{
        for place in places{
            if place.category == item{
                return false
            }
        }
    }else{
        for place in places{
            if place.group == item{
                return false
            }
        }
    }
    return true
}

만약 사용 중인 카테고리로 False가 반환되면 알림창을 띄우고 삭제하지 않는다.

2. 삽입

이미 존재하는 항목을 삽입하면 오류는 없을 수 있지만 단일 항목이 관리하기 용이하므로 존재하는지 확인 후 삽입하도록 했다.

항목이 존재하는지 확인하는 함수

   func checkExisted(item: String) -> Bool{
        for name in editItems{
            if name == item{
                return false
            }
        }
        return true
    }

통계

설정 페이지에 어떤 기능을 두면 좋을까 생각하다 메인 페이지에서 분류별, 그룹별로 볼 수 있지만 숫자로 확실히 통계를 보여주면 어느 분류를, 누구와 많이 갔는지 알 수 있어 편리할 듯 싶었다.

StatsitcsTableViewController를 만들고 스토리보드에 테이블 뷰를 추가했다.

Cell style을 Right Detail로 하여 이름과 개수를 나타나게 했다.

그룹별, 분류별 개수를 계산하는 함수

func calculate(name: String) -> String{
        var count = 0
        for place in places{
            if place.category == name || place.group == name{
                count = count + 1
            }
        }
        return String(count)
    }

그룹인지 분류인지 구분할 필요가 있나 싶어서 OR로 전체적으로 계산하게 했다.

통계에 개수로 내림차순 정렬을 넣거나 가장 많이 간 곳, 가장 많이 간 분류 이런 식으로 하나씩 보여지게 할까 고민중이다... 🤔

장소 이름 수정

장소 편집으로 이름을 바꾸면 이름으로 구분하던 이미지에 혼선이 생겼다.
원래는 이미지를 업로드 할 때 편집으로 넘어온 것인지, 이미지가 바뀌었는지만 판단하여 업로드 했는데 이름을 바꿔버리면 새로운 이미지가 필요하기 때문에 한 번 더 체크해야 했다.

즉, 장소 편집 시 이름을 바꾸면 이미지의 이름도 바꿔야 하는 문제이다.

모든 이미지의 이름을 변경하는 것을 아니고 상황에 따라 다른 처리가 필요했다.

이미지 유무에 따른 처리 방식

  1. 이미지 없음 -> 이미지 없음
    -> 장소 이름 변경되어도 상관 X
  2. 이미지 없음 -> 이미지 생김
    -> 새로운 이미지 저장
  3. 이미지 있음 -> 이미지 변경
    -> 이전 이름 이미지 삭제 + 변경 된 이름으로 새 이미지 저장
  4. 이미지 있음 -> 이미지 그대로
    -> 이전 이름 이미지 삭제 + 변경된 이름으로 원래 이미지 다시 저장

이미지가 없었을 때는 이름이 바뀌는 것과 상관없이 유지되거나 이미지가 업로드 돼서 바꿀 필요가 없었고, 이미지가 있었을 때만 이름이 바뀌었는지 한 번 더 확인했다.

이름이 변경되었으면 삭제 후 이미지를 다시 저장

if reName != tfPlaceName.text!{
	storageRef.child(Uid + "/" + reName).delete { error in
		if let error = error {
			print("Error removing image: \(error)")
		} else {
			print("Image successfully removed!")
		}
	}
}

profile
iOS Developer

0개의 댓글