32YB SOPT/APPJAM - PPPClub

[PPPClub] 앱잼 전 미리 참고할 사이트

신_이나 2023. 7. 7. 03:17

1. 카드 내리는 애니메이션

- 이미지 내릴 때 코드 Resize 코드 추가하기 전에 끌어 내려도 다시 원래대로 돌아가는 코드 참고

일정 y값까지 내려지면, 화면 뙇~ 나오기

그런데 내렸을때, 자연스럽게 공간이 보이는건가 ,,,? 아니면 알파값이 쏴~ 하면서 보이는건지.

그리고 아래 초대장을 내렸을 때 윗 부분은 어떻게 되는건지

UISwipeGesture? UIPanGesture? 를 써야하는건지, 아니면 Scroll 처럼 해도 되는건지 ,,,,, 

 

(내얼굴 이렇게 나오는거 부담스럽네)

https://ena-is.me/64

 

[SOPT] 애니메이션_3주차 (ContentOffset, Skeleton Animation)

애니메이션 클론코딩 스터디 in SOPT iOS 3주차는 ContentOffset 와 Skeleton Animation 에 대하여 공부하였다. ContentOffset 이란 UIScrollView의 하위 프로퍼티중 하나다. 직관적으로 말하자면, ContentOffset 은 내가

ena-is.me

 

2. 글자 수에 맞게 layout 동적으로 맞추기

 

-stackView 사용

https://ios-development.tistory.com/345

 

[iOS - swift] 내부 크기에 따라 동적으로 width 길이가 증가하는 뷰

상황 내부 크기가 동적으로 증가하는 경우 (label.text와 같은 경우), superView의 width를 동적으로 증가하여 내부 레이아웃을 유지할 수 있는 방법 값에 따라 크기가 동적으로 늘어나는 - 예시) UILabel l

ios-development.tistory.com

 

-sizeToFit 함수 사용 (sizeThatFits말고)

https://jintaewoo.tistory.com/27

 

sizeToFit / sizeThatFits 함수 알아보기

sizeToFit 함수를 사용하면 텍스트에 맞게 라벨의 크기가 조정됩니다. sizeThatFits 함수는 지정된 크기에 적합한 크기를 계산하여 반환합니다. 반환된 크기를 가지고 width/height 중 원하는 것만 조정할

jintaewoo.tistory.com

 

 

3. 디데이 세는 서버통신

 

희재꺼,,, 쓱싹해왔다,,

나 할 수 있겠지 ,,,  ? 할 수 있다.

//VC
public var index: Int = 0 {
        didSet {
            timer?.cancel()
            timer = nil
            self.endDate = self.productData[self.index].endDate
            self.calculateRemainngTime()
//            self.rootView.productCollectionView.reloadData()
        }
    }
    
    public var endDate: String? {
        didSet {
            startTimer(self.hour, self.minute, self.second)
            self.rootView.productCollectionView.reloadData()
        }
    }

//서버에서 받아온 시간 형식에 맞게 맞춰주는 부분
func calculateRemainngTime() {
        let format = DateFormatter()
        format.dateFormat = "yyyy-MM-dd HH:mm:ss"
        //1. 주어진 시간 DataFormat으로 바꾸기
        guard let endDate = self.endDate else { return }
        let formatEndDate: String = endDate.replacingOccurrences(of: "T", with: " ")
        guard let endTime = format.date(from: formatEndDate) else { return }
        
        //2. 현재 시간 DataFormat으로 바꾸기
        
        let currentTime = Date()    
        
        //3. 두 개 시간 빼주기
        
        let useTime = Int(endTime.timeIntervalSince(currentTime))
        
        let hour = useTime / 3600
        let minute = (useTime % 3600) / 60
        let second = (useTime % 3600) % 60
        
        self.hour = hour
        self.minute = minute
        self.second = second
    }
    
    // [실시간 반복 작업 시작 호출]

    func startTimer(_ hour: Int, _ minute: Int, _ second: Int) {
        if timer == nil {
            timer = DispatchSource.makeTimerSource(flags: [], queue: DispatchQueue.main)
            timer?.schedule(deadline: .now(), repeating: 1)
            timer?.setEventHandler(handler: {
                self.timerCallback()
            })
            timer?.resume()
        }
        
    }
    // [실시간 반복 작업 수행 부분]
    func timerCallback() {
        var timeChecker: TimeCheker?
        if self.second > 1 { timeChecker = .second }
        else if self.second <= 1 && self.minute > 0 { timeChecker = .minute }
        else if self.second <= 0 && self.minute <= 0 && self.hour > 0 { timeChecker = .hour }
        else { timeChecker = .end}
        
        self.endDate = timeChecker?.currentTime(hour: self.hour, minute: self.minute, second: self.second)
        
        self.second += timeChecker?.secondResult ?? 0
        self.minute += timeChecker?.minuteResult ?? 0
        self.hour += timeChecker?.hourResult ?? 0
    }

 

 

 

4. 아티클 받아오는 법

이건 희재가 알려준 대로 "우리만의 문법" 을 쓰기로 하였다 

코드 짜기 전에 확실하게 정리해둬야 알듯함