Browse Source

adapt height of quote view and messageInputBar depending on draft state and device orientation

cyberta 4 years ago
parent
commit
5ae6a8d76a

+ 4 - 0
deltachat-ios.xcodeproj/project.pbxproj

@@ -26,6 +26,7 @@
 		303492AD2577CAC300A523D0 /* FileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 303492AC2577CAC300A523D0 /* FileView.swift */; };
 		303492B32577E40700A523D0 /* DocumentPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 303492B22577E40700A523D0 /* DocumentPreview.swift */; };
 		303492CB257A814200A523D0 /* DraftArea.swift in Sources */ = {isa = PBXBuildFile; fileRef = 303492CA257A814200A523D0 /* DraftArea.swift */; };
+		303492CF2587C2DC00A523D0 /* ChatInputBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 303492CE2587C2DC00A523D0 /* ChatInputBar.swift */; };
 		304219D3243F588500516852 /* DcCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 304219D1243F588500516852 /* DcCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		304219D92440734A00516852 /* DcMsg+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 304219D82440734A00516852 /* DcMsg+Extension.swift */; };
 		304F5E44244F571C00462538 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7A9FB14A1FB061E2001FEA36 /* Assets.xcassets */; };
@@ -227,6 +228,7 @@
 		303492AC2577CAC300A523D0 /* FileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileView.swift; sourceTree = "<group>"; };
 		303492B22577E40700A523D0 /* DocumentPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentPreview.swift; sourceTree = "<group>"; };
 		303492CA257A814200A523D0 /* DraftArea.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DraftArea.swift; sourceTree = "<group>"; };
+		303492CE2587C2DC00A523D0 /* ChatInputBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatInputBar.swift; sourceTree = "<group>"; };
 		304219D1243F588500516852 /* DcCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DcCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		304219D82440734A00516852 /* DcMsg+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DcMsg+Extension.swift"; sourceTree = "<group>"; };
 		3052C609253F082E007D13EA /* MessageLabelDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageLabelDelegate.swift; sourceTree = "<group>"; };
@@ -562,6 +564,7 @@
 				303492AC2577CAC300A523D0 /* FileView.swift */,
 				303492B22577E40700A523D0 /* DocumentPreview.swift */,
 				303492CA257A814200A523D0 /* DraftArea.swift */,
+				303492CE2587C2DC00A523D0 /* ChatInputBar.swift */,
 			);
 			path = Views;
 			sourceTree = "<group>";
@@ -1182,6 +1185,7 @@
 				AE4AEE3522B1030D000AA495 /* PreviewController.swift in Sources */,
 				7070FB9B2101ECBB000DC258 /* NewGroupController.swift in Sources */,
 				304219D92440734A00516852 /* DcMsg+Extension.swift in Sources */,
+				303492CF2587C2DC00A523D0 /* ChatInputBar.swift in Sources */,
 				AE52EA19229EB53C00C586C9 /* ContactDetailHeader.swift in Sources */,
 				78E45E4421D3F14A00D4B15E /* UIImage+Extension.swift in Sources */,
 				30734326249A280B00BF9AD1 /* MediaQualityController.swift in Sources */,

+ 5 - 6
deltachat-ios/Chat/ChatViewController.swift

@@ -28,7 +28,7 @@ class ChatViewController: UITableViewController {
     }()
 
     /// The `InputBarAccessoryView` used as the `inputAccessoryView` in the view controller.
-    open var messageInputBar = InputBarAccessoryView()
+    open var messageInputBar = ChatInputBar()
 
     lazy var draftArea: DraftArea = {
         let view = DraftArea()
@@ -155,7 +155,6 @@ class ChatViewController: UITableViewController {
             configureDraftArea(draft: draft)
         }
 
-
         let notificationCenter = NotificationCenter.default
         notificationCenter.addObserver(self,
                                        selector: #selector(saveDraft),
@@ -163,8 +162,6 @@ class ChatViewController: UITableViewController {
                                        object: nil)
         notificationCenter.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
         prepareContextMenu()
-
-
     }
 
     @objc func keyboardWillShow(_ notification: Notification) {
@@ -175,6 +172,10 @@ class ChatViewController: UITableViewController {
                         self?.scrollToBottom(animated: true)
                     }
                 }
+                DispatchQueue.main.async { [weak self] in
+                    guard let self = self else { return }
+                    self.configureDraftArea(draft: self.draft)
+                }
             }
         }
     }
@@ -955,8 +956,6 @@ class ChatViewController: UITableViewController {
         }
     }
 
-
-
     private func sendImage(_ image: UIImage, message: String? = nil) {
         DispatchQueue.global().async {
             if let path = DcUtils.saveImage(image: image) {

+ 32 - 0
deltachat-ios/Chat/Views/ChatInputBar.swift

@@ -0,0 +1,32 @@
+import UIKit
+import InputBarAccessoryView
+
+public class ChatInputBar: InputBarAccessoryView {
+
+    var hasDraft: Bool = false
+    var hasQuote: Bool = false
+
+    override open func calculateMaxTextViewHeight() -> CGFloat {
+        let divisor: CGFloat = traitCollection.verticalSizeClass == .regular ? 3 : 5
+        var subtract: CGFloat = 0
+        subtract += hasDraft ? 90 : 0
+        subtract += hasQuote ? 90 : 0
+        let height = (UIScreen.main.bounds.height / divisor).rounded(.down) - subtract
+        if height < 40 {
+            return 40
+        }
+        return height
+    }
+
+    public func configure(draft: DraftModel) {
+        hasDraft = draft.draftAttachment != nil
+        hasQuote = draft.quoteText != nil
+        maxTextViewHeight = calculateMaxTextViewHeight()
+    }
+
+    public func cancel() {
+        hasDraft = false
+        hasQuote = false
+        maxTextViewHeight = calculateMaxTextViewHeight()
+    }
+}

+ 6 - 1
deltachat-ios/Chat/Views/DraftArea.swift

@@ -4,7 +4,6 @@ import DcCore
 import InputBarAccessoryView
 
 public class DraftArea: UIView, InputItem {
-
     public var inputBarAccessoryView: InputBarAccessoryView?
     public var parentStackViewPosition: InputStackView.Position?
     public func textViewDidChangeAction(with textView: InputTextView) {}
@@ -71,12 +70,18 @@ public class DraftArea: UIView, InputItem {
         quotePreview.configure(draft: draft)
         mediaPreview.configure(draft: draft)
         documentPreview.configure(draft: draft)
+        if let chatInputBar = inputBarAccessoryView as? ChatInputBar {
+            chatInputBar.configure(draft: draft)
+        }
     }
 
     public func cancel() {
         quotePreview.cancel()
         mediaPreview.cancel()
         documentPreview.cancel()
+        if let chatInputBar = inputBarAccessoryView as? ChatInputBar {
+            chatInputBar.cancel()
+        }
     }
 
 }

+ 3 - 0
deltachat-ios/Chat/Views/QuotePreview.swift

@@ -21,11 +21,13 @@ public class QuotePreview: DraftPreview {
     override public func cancel() {
         quoteView.prepareForReuse()
         delegate?.onCancelQuote()
+        quoteView.quote.numberOfLines = 3
     }
 
     override public func configure(draft: DraftModel) {
         if let quoteText = draft.quoteText {
             quoteView.quote.text = quoteText
+            quoteView.quote.numberOfLines = draft.draftAttachment != nil ? 1 : 3
             if let quoteMessage = draft.quoteMessage {
                 let contact = quoteMessage.fromContact
                 quoteView.senderTitle.text = contact.displayName
@@ -33,6 +35,7 @@ public class QuotePreview: DraftPreview {
                 quoteView.citeBar.backgroundColor = contact.color
                 quoteView.imagePreview.image = quoteMessage.image
             }
+
             isHidden = false
         } else {
             isHidden = true