Skip to content

Commit

Permalink
[#45] 시간여행 대화방 애니메이션 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
pcsoyeon authored Jul 16, 2022
2 parents 7e29768 + 84ee277 commit 51684e8
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@ extension DialogViewController {
}

// 나타나는 애니메이션

internal func showView(_ component: UIView, delay: Double = 0.8, duration: Double = 0.3){
UIView.animate(withDuration: duration, delay: delay, options: .curveEaseOut) {
component.alpha = 1
Expand Down
156 changes: 125 additions & 31 deletions Deartoday/Deartoday/Screen/Dialog/Controller/DialogViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,14 @@ final class DialogViewController: UIViewController {
반갑게 손을 흔들며 당신을 맞이하네요.
한 번 인사를 건네보세요!
"""
guideLabel.addLineSpacing(spacing: 27)
guideLabel.textAlignment = .center
pastMessageView.dialogText = """
안녕! 나는 \(year)년도의 너야.
만나서 정말 반가워!
너에게 몇 가지 궁금한 게 있는데
괜찮다면 너와 잠깐 얘기하고 싶어.
"""
안녕! 나는 \(year)년도의 너야.
만나서 정말 반가워!
너에게 몇 가지 궁금한 게 있는데
괜찮다면 너와 잠깐 얘기하고 싶어.
"""
}
}

Expand Down Expand Up @@ -57,8 +59,17 @@ final class DialogViewController: UIViewController {
}
}

private var canSendMessage: Bool = false {
didSet {
sendButton.isUserInteractionEnabled = canSendMessage ? true : false
}
}

private var isTextViewEditing: Bool = false

private var questions: [String] = DialogDataModel.questions
private var answers: [String] = ["", "", "", "", "", "", ""]
private var lastMessage: [String] = DialogDataModel.lastMessage
private var answers = [String]()

private var count: Int = 0

Expand Down Expand Up @@ -145,6 +156,7 @@ final class DialogViewController: UIViewController {

private lazy var sendButton = UIButton().then {
$0.setTitle("보내기", for: .normal)
$0.setTitleColor(.gray01, for: .disabled)
$0.setTitleColor(.blue02, for: .normal)
$0.setTitleColor(.blue02, for: .highlighted)
$0.isHidden = true
Expand Down Expand Up @@ -176,13 +188,13 @@ final class DialogViewController: UIViewController {
self.showButton(self.nextButton) { }
}
}
} else {
} else if sender.text == "응, 좋아!"{
hidePastView(self.pastMessageView) { }
hideButton(self.nextButton) {
self.pastMessageView.dialogText = """
고마워!
아하, 너는 이때로 가장 돌아가고 싶었구나.
"""
고마워!
아하, 너는 이때로 가장 돌아가고 싶었구나.
"""

self.setDialogMessageViewHeight()

Expand All @@ -193,18 +205,103 @@ final class DialogViewController: UIViewController {
}
}
}
} else {
view.window?.rootViewController?.dismiss(animated: true)
}
}

@objc func sendButtonDidTap() {
print("보내기 버튼 누르기")
presentMessageView.dialogText = answerTextView.text
setDialogMessageViewHeight()

answerTextView.text = ""
sendButton.isEnabled = false

count += 1
switch count {
case 0, 1, 2, 3, 4, 5:
hidePastView(pastMessageView) {
self.showPresentView(self.presentMessageView) {
self.sendButton.isEnabled = false
self.hidePresentView(self.presentMessageView) {
self.pastMessageView.dialogText = self.questions[self.count]
self.setDialogMessageViewHeight()

self.showPastView(self.pastMessageView) {
self.sendButton.isEnabled = true
}
}
}
}
case 6:
hidePastView(pastMessageView) {
self.showPresentView(self.presentMessageView) {
self.hidePresentView(self.presentMessageView) {
self.guideText = "마지막으로,\n과거의 당신에게 꼭 해주고 싶은 말을 남기세요."
self.guideLabel.snp.updateConstraints {
$0.top.equalTo(self.view.safeAreaLayoutGuide).inset(300)
}

self.showNarrationLabel(self.guideLabel) {
self.presentMessageView.dialogText = self.answerTextView.text
self.setDialogMessageViewHeight()
self.sendButton.isEnabled = true
}
}
}
}
default:
hideNarrationLabel(guideLabel) {
self.showPresentView(self.presentMessageView) {
self.hidePastView(self.photoImageView, delay: 1.0 , duration: 1.0) { }
UIView.animate(withDuration: 1.0, delay: 0.7, options: .curveEaseOut) {
self.presentMessageView.transform = CGAffineTransform(translationX: 0, y: -154)
self.presentMessageView.alpha = 0
} completion: { _ in
[self.answerTextView, self.underLineView, self.sendButton].forEach {
$0.isHidden = true
}
self.answerTextView.resignFirstResponder()

self.pastMessageView.dialogText = "소중한 말 남겨줘서 정말 고마워."
self.setDialogMessageViewHeight()

self.pastMessageView.snp.updateConstraints {
$0.top.equalTo(self.view.safeAreaLayoutGuide).inset(228)
}

self.showPastView(self.pastMessageView) {
self.hidePastView(self.pastMessageView, delay: 1.2, duration: 1.0) {
self.pastMessageView.dialogText = self.lastMessage[0]
self.setDialogMessageViewHeight(topConstant: 228)

self.showPastView(self.pastMessageView) {
self.hidePastView(self.pastMessageView) {
self.pastMessageView.dialogText = self.lastMessage[1]
self.setDialogMessageViewHeight(topConstant: 228)

self.showPastView(self.pastMessageView) {
self.nextButton.text = "다시 오늘을 살아가기"
self.nextButton.snp.updateConstraints {
$0.bottom.equalTo(self.view.safeAreaLayoutGuide).inset(2)
$0.centerX.equalToSuperview()
$0.width.equalTo(363)
}
self.showButton(self.nextButton) { }
}
}
}
}
}
}
}
}
}
}

// MARK: - Custom Method

private func setUI() {
view.backgroundColor = .gray

setDateLabel()

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
Expand Down Expand Up @@ -258,7 +355,7 @@ final class DialogViewController: UIViewController {
$0.leading.equalToSuperview().inset(165)
}

[yearLabel , monthLabel, dayLabel].forEach {
[yearLabel, monthLabel, dayLabel].forEach {
$0.snp.makeConstraints {
$0.centerX.centerY.equalToSuperview()
}
Expand All @@ -284,13 +381,15 @@ final class DialogViewController: UIViewController {
pastMessageView.snp.makeConstraints {
$0.top.equalTo(view.safeAreaLayoutGuide).inset(228)
$0.width.equalTo(343)
$0.height.equalTo(110)
$0.height.equalTo(115)
$0.centerX.equalToSuperview()
}

presentMessageView.snp.makeConstraints {
$0.top.equalTo(view.safeAreaLayoutGuide).inset(228)
$0.height.equalTo(110)
$0.width.equalTo(343)
$0.height.equalTo(115)
$0.centerX.equalToSuperview()
}

photoImageView.snp.makeConstraints {
Expand Down Expand Up @@ -334,7 +433,7 @@ final class DialogViewController: UIViewController {
}

private func setDialogAnimation() {
pastMessageView.dialogText = DialogDataModel.questions[0]
pastMessageView.dialogText = questions[count]
setDialogMessageViewHeight()

showPastView(self.pastMessageView) {
Expand All @@ -349,12 +448,14 @@ final class DialogViewController: UIViewController {
answerTextView.delegate = self
}

private func setDialogMessageViewHeight() {
let height = pastMessageView.dialogLabel.intrinsicContentSize.height + 30

pastMessageView.snp.updateConstraints {
$0.top.equalTo(self.view.safeAreaLayoutGuide).inset(290)
$0.height.equalTo(height)
private func setDialogMessageViewHeight(topConstant: Double = 290) {
[pastMessageView, presentMessageView].forEach {
let height = $0.dialogLabel.intrinsicContentSize.height + 30

$0.snp.updateConstraints {
$0.top.equalTo(self.view.safeAreaLayoutGuide).inset(topConstant)
$0.height.equalTo(height)
}
}
}
}
Expand All @@ -367,6 +468,7 @@ extension DialogViewController: UITextViewDelegate {
}

func textViewDidChange(_ textView: UITextView) {

let size = CGSize(width: answerTextView.frame.width, height: .infinity)
let estimatedSize = textView.sizeThatFits(size)

Expand All @@ -388,12 +490,4 @@ extension DialogViewController: UITextViewDelegate {
}
}
}

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if text == "\n" {
textView.resignFirstResponder()
return false
}
return true
}
}
13 changes: 8 additions & 5 deletions Deartoday/Deartoday/Screen/Dialog/Model/DialogDataModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@
import Foundation

struct DialogDataModel {
static let questions: [String] = ["이때가 어떤 순간이었는지 설명해줄 수 있을까?",
"그럼, 이때 어떤 감정과 생각이 들었어? ",
"너가 이 순간으로 돌아오고 싶다고 생각한 이유가 알고 싶어.",
"이 순간을 생각했을 때 혹시 과거랑 지금 달라진 점이 있을까?",
"그렇다면, 이때의 경험이 가지는 의미를 새롭게 생각해볼 수 있지 않을까?",
static let questions: [String] = ["이 순간에 대해 설명해 줄 수 있어?",
"그럼, 그 당시에 너는 어떤 감정과 생각이 들었던 것 같아?",
"너가 왜 돌아가고 싶은 순간으로 이때를 골랐는지 알고 싶어.",
"과거의 이 순간을 떠올리면 지금은 어떤 감정과 생각이 들어?",
"그렇다면, 너는 이때의 경험으로부터 어떤 점들을 가져가고 싶어?",
"너의 2022년은 어때?"]

static let lastMessage: [String] = ["우리는 어쩌면 10년 후에 “그때가 좋았지” 하면서\n시간을 되돌리고 싶어할 수도 있어.",
"그럼, 지금부터 다시 시작하자.\n너는 지금, 10년 후의 미래에서 되돌아온 거야.\n그러니 행복한 이 순간에 최선을 다해 살 수 있기를 :)"]
}
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,14 @@ final class DialogMessageView: UIView {
}

private func setLayout() {
addSubview(backgroundImageView)
backgroundImageView.addSubview(dialogLabel)
addSubviews([backgroundImageView, dialogLabel])

backgroundImageView.snp.makeConstraints {
$0.top.leading.trailing.bottom.equalToSuperview()
}

dialogLabel.snp.makeConstraints {
$0.bottom.equalToSuperview().inset(13)
$0.top.equalToSuperview().inset(10)
$0.leading.trailing.equalToSuperview().inset(35)
}
}
Expand Down

0 comments on commit 51684e8

Please sign in to comment.