feat: let text editor become first responder when compose scene appear
This commit is contained in:
parent
97ecbb1bfb
commit
2b2759c2cc
|
@ -10,25 +10,7 @@ import CoreData
|
||||||
|
|
||||||
enum ComposeStatusItem {
|
enum ComposeStatusItem {
|
||||||
case replyTo(tootObjectID: NSManagedObjectID)
|
case replyTo(tootObjectID: NSManagedObjectID)
|
||||||
case toot(attribute: InputAttribute)
|
case toot(replyToTootObjectID: NSManagedObjectID?)
|
||||||
}
|
}
|
||||||
|
|
||||||
extension ComposeStatusItem: Hashable { }
|
extension ComposeStatusItem: Hashable { }
|
||||||
|
|
||||||
extension ComposeStatusItem {
|
|
||||||
class InputAttribute: Hashable {
|
|
||||||
let hasReplyTo: Bool
|
|
||||||
|
|
||||||
init(hasReplyTo: Bool) {
|
|
||||||
self.hasReplyTo = hasReplyTo
|
|
||||||
}
|
|
||||||
|
|
||||||
func hash(into hasher: inout Hasher) {
|
|
||||||
hasher.combine(hasReplyTo)
|
|
||||||
}
|
|
||||||
|
|
||||||
static func == (lhs: ComposeStatusItem.InputAttribute, rhs: ComposeStatusItem.InputAttribute) -> Bool {
|
|
||||||
return lhs.hasReplyTo == rhs.hasReplyTo
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -59,6 +59,36 @@ extension ComposeViewController {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override func viewWillAppear(_ animated: Bool) {
|
||||||
|
super.viewWillAppear(animated)
|
||||||
|
|
||||||
|
// Fix AutoLayout conflict issue
|
||||||
|
DispatchQueue.main.async { [weak self] in
|
||||||
|
guard let self = self else { return }
|
||||||
|
self.markTextViewEditorBecomeFirstResponser()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
extension ComposeViewController {
|
||||||
|
private func markTextViewEditorBecomeFirstResponser() {
|
||||||
|
guard let diffableDataSource = viewModel.diffableDataSource else { return }
|
||||||
|
let items = diffableDataSource.snapshot().itemIdentifiers
|
||||||
|
for item in items {
|
||||||
|
switch item {
|
||||||
|
case .toot:
|
||||||
|
guard let indexPath = diffableDataSource.indexPath(for: item),
|
||||||
|
let cell = tableView.cellForRow(at: indexPath) as? ComposeTootContentTableViewCell else {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
cell.textEditorView.isEditing = true
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension ComposeViewController {
|
extension ComposeViewController {
|
||||||
|
|
|
@ -30,9 +30,9 @@ extension ComposeViewModel {
|
||||||
switch composeKind {
|
switch composeKind {
|
||||||
case .replyToot(let tootObjectID):
|
case .replyToot(let tootObjectID):
|
||||||
snapshot.appendItems([.replyTo(tootObjectID: tootObjectID)], toSection: .repliedTo)
|
snapshot.appendItems([.replyTo(tootObjectID: tootObjectID)], toSection: .repliedTo)
|
||||||
snapshot.appendItems([.toot(attribute: ComposeStatusItem.InputAttribute(hasReplyTo: true))], toSection: .status)
|
snapshot.appendItems([.toot(replyToTootObjectID: tootObjectID)], toSection: .status)
|
||||||
case .toot:
|
case .toot:
|
||||||
snapshot.appendItems([.toot(attribute: ComposeStatusItem.InputAttribute(hasReplyTo: false))], toSection: .status)
|
snapshot.appendItems([.toot(replyToTootObjectID: nil)], toSection: .status)
|
||||||
}
|
}
|
||||||
diffableDataSource.apply(snapshot, animatingDifferences: false)
|
diffableDataSource.apply(snapshot, animatingDifferences: false)
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,10 +6,18 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
import TwitterTextEditor
|
||||||
|
|
||||||
final class ComposeTootContentTableViewCell: UITableViewCell {
|
final class ComposeTootContentTableViewCell: UITableViewCell {
|
||||||
|
|
||||||
let statusView = StatusView()
|
let statusView = StatusView()
|
||||||
|
let textEditorView: TextEditorView = {
|
||||||
|
let textEditorView = TextEditorView()
|
||||||
|
textEditorView.font = .preferredFont(forTextStyle: .body)
|
||||||
|
// textEditorView.scrollView.isScrollEnabled = false
|
||||||
|
textEditorView.isScrollEnabled = false
|
||||||
|
return textEditorView
|
||||||
|
}()
|
||||||
|
|
||||||
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
|
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
|
||||||
super.init(style: style, reuseIdentifier: reuseIdentifier)
|
super.init(style: style, reuseIdentifier: reuseIdentifier)
|
||||||
|
@ -26,15 +34,50 @@ final class ComposeTootContentTableViewCell: UITableViewCell {
|
||||||
extension ComposeTootContentTableViewCell {
|
extension ComposeTootContentTableViewCell {
|
||||||
|
|
||||||
private func _init() {
|
private func _init() {
|
||||||
|
selectionStyle = .none
|
||||||
|
|
||||||
statusView.translatesAutoresizingMaskIntoConstraints = false
|
statusView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
contentView.addSubview(statusView)
|
contentView.addSubview(statusView)
|
||||||
NSLayoutConstraint.activate([
|
NSLayoutConstraint.activate([
|
||||||
statusView.topAnchor.constraint(equalTo: contentView.topAnchor),
|
statusView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 20),
|
||||||
statusView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
|
statusView.leadingAnchor.constraint(equalTo: contentView.readableContentGuide.leadingAnchor),
|
||||||
statusView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
|
statusView.trailingAnchor.constraint(equalTo: contentView.readableContentGuide.trailingAnchor),
|
||||||
statusView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
|
|
||||||
])
|
])
|
||||||
|
statusView.statusContainerStackView.isHidden = true
|
||||||
|
statusView.actionToolbarContainer.isHidden = true
|
||||||
|
|
||||||
|
textEditorView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
contentView.addSubview(textEditorView)
|
||||||
|
NSLayoutConstraint.activate([
|
||||||
|
textEditorView.topAnchor.constraint(equalTo: statusView.bottomAnchor, constant: 10),
|
||||||
|
textEditorView.leadingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.leadingAnchor),
|
||||||
|
textEditorView.trailingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.trailingAnchor),
|
||||||
|
contentView.bottomAnchor.constraint(equalTo: textEditorView.bottomAnchor, constant: 20),
|
||||||
|
textEditorView.heightAnchor.constraint(greaterThanOrEqualToConstant: 44).priority(.defaultHigh),
|
||||||
|
])
|
||||||
|
|
||||||
|
// let containerStackView = UIStackView()
|
||||||
|
// containerStackView.axis = .vertical
|
||||||
|
// containerStackView.spacing = 8
|
||||||
|
// containerStackView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
// contentView.addSubview(containerStackView)
|
||||||
|
// NSLayoutConstraint.activate([
|
||||||
|
// containerStackView.topAnchor.constraint(equalTo: statusView.bottomAnchor, constant: 10),
|
||||||
|
// containerStackView.leadingAnchor.constraint(equalTo: contentView.readableContentGuide.leadingAnchor),
|
||||||
|
// containerStackView.trailingAnchor.constraint(equalTo: contentView.readableContentGuide.trailingAnchor),
|
||||||
|
// contentView.bottomAnchor.constraint(equalTo: containerStackView.bottomAnchor, constant: 20),
|
||||||
|
// ])
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
}
|
||||||
|
|
||||||
|
override func didMoveToWindow() {
|
||||||
|
super.didMoveToWindow()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension ComposeTootContentTableViewCell {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -20,7 +20,6 @@ protocol StatusTableViewCellDelegate: class {
|
||||||
var playerViewControllerDelegate: AVPlayerViewControllerDelegate? { get }
|
var playerViewControllerDelegate: AVPlayerViewControllerDelegate? { get }
|
||||||
func statusTableViewCell(_ cell: StatusTableViewCell, playerViewControllerDidPressed playerViewController: AVPlayerViewController)
|
func statusTableViewCell(_ cell: StatusTableViewCell, playerViewControllerDidPressed playerViewController: AVPlayerViewController)
|
||||||
|
|
||||||
|
|
||||||
func statusTableViewCell(_ cell: StatusTableViewCell, statusView: StatusView, contentWarningActionButtonPressed button: UIButton)
|
func statusTableViewCell(_ cell: StatusTableViewCell, statusView: StatusView, contentWarningActionButtonPressed button: UIButton)
|
||||||
func statusTableViewCell(_ cell: StatusTableViewCell, mosaicImageViewContainer: MosaicImageViewContainer, didTapContentWarningVisualEffectView visualEffectView: UIVisualEffectView)
|
func statusTableViewCell(_ cell: StatusTableViewCell, mosaicImageViewContainer: MosaicImageViewContainer, didTapContentWarningVisualEffectView visualEffectView: UIVisualEffectView)
|
||||||
func statusTableViewCell(_ cell: StatusTableViewCell, mosaicImageViewContainer: MosaicImageViewContainer, didTapImageView imageView: UIImageView, atIndex index: Int)
|
func statusTableViewCell(_ cell: StatusTableViewCell, mosaicImageViewContainer: MosaicImageViewContainer, didTapImageView imageView: UIImageView, atIndex index: Int)
|
||||||
|
|
Loading…
Reference in New Issue