From df7e74b10ea3f3b5b346fb3a3f6ab10d4d3ca1d1 Mon Sep 17 00:00:00 2001 From: fish Date: Mon, 13 Jul 2026 22:01:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=94=AE=E7=9B=98=E4=B8=8A?= =?UTF-8?q?=E6=96=B9=E6=B5=AE=E5=8A=A8=E5=AE=8C=E6=88=90=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Note/FormatLogViewController.swift | 33 +++++++++++++++++++++++++++ Note/FormatNoteViewController.swift | 35 ++++++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/Note/FormatLogViewController.swift b/Note/FormatLogViewController.swift index 74ab6e5..064e83a 100644 --- a/Note/FormatLogViewController.swift +++ b/Note/FormatLogViewController.swift @@ -11,6 +11,8 @@ class FormatLogViewController: UIViewController { private var textView: UITextView! private var formatButton: UIButton! + private var floatingDoneButton: UIButton! + private var floatingDoneButtonBottomConstraint: NSLayoutConstraint! private var doneButton: UIBarButtonItem! private var pasteButton: UIBarButtonItem! private var resetButton: UIBarButtonItem! @@ -65,7 +67,28 @@ class FormatLogViewController: UIViewController { formatButton.addTarget(self, action: #selector(didTapFormatButton), for: .touchUpInside) view.addSubview(formatButton) + var doneConfig = UIButton.Configuration.glass() + doneConfig.title = "完成" + doneConfig.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { incoming in + var outgoing = incoming + outgoing.font = UIFont.systemFont(ofSize: 17, weight: .semibold) + return outgoing + } + doneConfig.baseForegroundColor = .label + doneConfig.cornerStyle = .capsule + doneConfig.contentInsets = NSDirectionalEdgeInsets(top: 15, leading: 22, bottom: 15, trailing: 22) + floatingDoneButton = UIButton(configuration: doneConfig) + floatingDoneButton.translatesAutoresizingMaskIntoConstraints = false + floatingDoneButton.alpha = 0 + floatingDoneButton.addTarget(self, action: #selector(didTapFloatingDoneButton), for: .touchUpInside) + view.addSubview(floatingDoneButton) + + floatingDoneButtonBottomConstraint = floatingDoneButton.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -16) + NSLayoutConstraint.activate([ + floatingDoneButton.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -16), + floatingDoneButtonBottomConstraint, + textView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 16), textView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16), textView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16), @@ -82,6 +105,10 @@ class FormatLogViewController: UIViewController { textView.resignFirstResponder() } + @objc private func didTapFloatingDoneButton() { + textView.resignFirstResponder() + } + private func setupKeyboardObservers() { NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil) @@ -98,6 +125,9 @@ class FormatLogViewController: UIViewController { UIView.animate(withDuration: duration, delay: 0, options: .beginFromCurrentState) { self.textView.contentInset.bottom = keyboardHeight self.textView.verticalScrollIndicatorInsets.bottom = keyboardHeight + self.floatingDoneButtonBottomConstraint.constant = -(keyboardHeight + 8) + self.floatingDoneButton.alpha = 1 + self.view.layoutIfNeeded() } } @@ -107,6 +137,9 @@ class FormatLogViewController: UIViewController { UIView.animate(withDuration: duration, delay: 0, options: .beginFromCurrentState) { self.textView.contentInset.bottom = 0 self.textView.verticalScrollIndicatorInsets.bottom = 0 + self.floatingDoneButtonBottomConstraint.constant = -16 + self.floatingDoneButton.alpha = 0 + self.view.layoutIfNeeded() } } diff --git a/Note/FormatNoteViewController.swift b/Note/FormatNoteViewController.swift index 7200835..73bf468 100644 --- a/Note/FormatNoteViewController.swift +++ b/Note/FormatNoteViewController.swift @@ -12,6 +12,8 @@ class FormatNoteViewController: UIViewController { private var textView: UITextView! private var iCloudButton: UIButton! private var noteButton: UIButton! + private var floatingDoneButton: UIButton! + private var floatingDoneButtonBottomConstraint: NSLayoutConstraint! private var doneButton: UIBarButtonItem! private var pasteButton: UIBarButtonItem! private var resetButton: UIBarButtonItem! @@ -66,10 +68,28 @@ class FormatNoteViewController: UIViewController { noteButton.addTarget(self, action: #selector(didTapNoteButton), for: .touchUpInside) view.addSubview(noteButton) + var doneConfig = UIButton.Configuration.glass() + doneConfig.title = "完成" + doneConfig.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { incoming in + var outgoing = incoming + outgoing.font = UIFont.systemFont(ofSize: 17, weight: .semibold) + return outgoing + } + doneConfig.baseForegroundColor = .label + doneConfig.cornerStyle = .capsule + doneConfig.contentInsets = NSDirectionalEdgeInsets(top: 15, leading: 22, bottom: 15, trailing: 22) + floatingDoneButton = UIButton(configuration: doneConfig) + floatingDoneButton.translatesAutoresizingMaskIntoConstraints = false + floatingDoneButton.alpha = 0 + floatingDoneButton.addTarget(self, action: #selector(didTapFloatingDoneButton), for: .touchUpInside) + view.addSubview(floatingDoneButton) + let safeArea = view.safeAreaLayoutGuide let buttonHeight: CGFloat = 52 let spacing: CGFloat = 16 + floatingDoneButtonBottomConstraint = floatingDoneButton.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -spacing) + NSLayoutConstraint.activate([ textView.topAnchor.constraint(equalTo: safeArea.topAnchor, constant: spacing), textView.leadingAnchor.constraint(equalTo: safeArea.leadingAnchor, constant: spacing), @@ -85,7 +105,10 @@ class FormatNoteViewController: UIViewController { noteButton.leadingAnchor.constraint(equalTo: safeArea.centerXAnchor, constant: spacing / 2), noteButton.trailingAnchor.constraint(equalTo: safeArea.trailingAnchor, constant: -spacing), noteButton.heightAnchor.constraint(equalToConstant: buttonHeight), - noteButton.bottomAnchor.constraint(equalTo: safeArea.bottomAnchor, constant: -spacing) + noteButton.bottomAnchor.constraint(equalTo: safeArea.bottomAnchor, constant: -spacing), + + floatingDoneButton.trailingAnchor.constraint(equalTo: safeArea.trailingAnchor, constant: -spacing), + floatingDoneButtonBottomConstraint ]) } @@ -106,6 +129,10 @@ class FormatNoteViewController: UIViewController { textView.resignFirstResponder() } + @objc private func didTapFloatingDoneButton() { + textView.resignFirstResponder() + } + private func setupKeyboardObservers() { NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil) @@ -122,6 +149,9 @@ class FormatNoteViewController: UIViewController { UIView.animate(withDuration: duration, delay: 0, options: .beginFromCurrentState) { self.textView.contentInset.bottom = keyboardHeight self.textView.verticalScrollIndicatorInsets.bottom = keyboardHeight + self.floatingDoneButtonBottomConstraint.constant = -(keyboardHeight + 8) + self.floatingDoneButton.alpha = 1 + self.view.layoutIfNeeded() } } @@ -131,6 +161,9 @@ class FormatNoteViewController: UIViewController { UIView.animate(withDuration: duration, delay: 0, options: .beginFromCurrentState) { self.textView.contentInset.bottom = 0 self.textView.verticalScrollIndicatorInsets.bottom = 0 + self.floatingDoneButtonBottomConstraint.constant = -16 + self.floatingDoneButton.alpha = 0 + self.view.layoutIfNeeded() } }