•
→ textfield를 누르는 것과 return 키를 누르는 것 모두 UITextFieldDelegate를 사용해서 구현하자!
extension LoginViewController: UITextFieldDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) {
let move = CGAffineTransform(translationX: 0, y: -50)
UIView.animate(withDuration: 0.2, animations: {
self.profileImage.transform = move
self.partLabel.transform = move
self.partTextField.transform = move
self.nameLabel.transform = move
self.nameTextField.transform = move
})
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
UIView.animate(withDuration: 0.2, animations: {
self.profileImage.transform = .identity
self.partLabel.transform = .identity
self.partTextField.transform = .identity
self.nameLabel.transform = .identity
self.nameTextField.transform = .identity
})
textField.resignFirstResponder()
return true
}
}
Swift
복사
◦
UITextFieldDelegate에 있는 textFieldDidBeginEditing, textFieldShouldReturn를 사용
▪
textFieldDidBeginEditing : textField 수정이 시작될 때 동작 → textField를 누르면 동작
▪
textFieldShouldReturn : textField의 return키를 눌렀을 때 동작
◦
CGAffineTransform의 translaionX를 사용해서 y좌표를 50 올리자 → animate함수에 넣어주면 이미지가 올라가는 동작이 완성
◦
다시 내려오는 동작은 .identity를 사용해서 원래 자리로 돌아오게 해주자
◦
resignFirstResponder 는 키보드가 자동으로 내려가도록 동작함
•
도전 과제
→ UIScrollViewDelegate를 사용해서 헤더의 움직임을 구현하자!
extension ViewController: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
UIView.animate(withDuration: 0.3, animations: {
if self.isTop == false {
self.headerView.transform = CGAffineTransform(translationX: 0, y: -88)
}
if scrollView.contentOffset.y > 0 {
self.isTop = false
self.scrollView.frame.size.height = UIScreen.main.bounds.size.height
self.scrollView.transform = CGAffineTransform(translationX: 0, y: -88)
} else {
self.isTop = true
}
})
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
UIView.animate(withDuration: 0.3, animations: {
if scrollView.contentOffset.y >= 0 {
self.headerView.transform = .identity
self.scrollView.transform = .identity
}
})
}
}
Swift
복사
◦
UIScrollViewDelegate에 있는 scrollViewDidScroll과 scrollViewDidEndDecelerating를 사용
▪
scrollViewDidScroll : scrollView가 scroll되면 동작
▪
scrollViewDidEndDecelerating : scrollView가 scroll되다가 scroll되는 속도가 감속되면 동작
→ 이건 그냥 멈추면 헤더 나타나는 동작이 안 나타날 수도 있다
◦
헤더의 움직임은 일반 과제와 동일하게 CGAffineTransform 와 .identity를 사용
◦
움직이는 조건은 scrollView y좌표의 contentOffset이 0보다 크면 애니메이션이 작동하도록 했다
→ 상단에서 스크롤하면 움직이지 않도록, 그 외의 부분에서는 애니메이션 작동
◦
isTop이라는 boolean값을 사용해서 headerView가 상단에서 스크롤할 때 움직이지 않도록 했다
→ 같은 조건(scrollView.contentOffset.y > 0)에 넣었더니 상단에서 스크롤 하고 나서 두 View 사이에
️빈 틈
️이 생김
→ scrollView의 frame은 애니메이션에 의해서 translationX의 y값정도 위로 올라가 있다. 따라서 우리는 tabBar와 scrollView사이에
️틈
️을 발견할 수 있다. 이 틈을 메우기 위해선 scrollView의 frame height를 UIScreen의 height 사이즈로 지정해줘야 한다.