Просмотр исходного кода

feat: 评论增加定位功能,动态图片改为右边拼接

陈文艺 1 месяц назад
Родитель
Сommit
5db804954b

+ 3 - 1
Lanu/Common/Views/LNPopupView.swift

@@ -20,6 +20,7 @@ class LNPopupView: UIView {
     let container = UIView()
     var containerHeight: LNPopupViewHeight = .auto
     var touchOutsideToCancel = true
+    var ignoreKeyboardToDismiss = false
     var onTouchOutside: (() -> Void)?
     
     override init(frame: CGRect) {
@@ -77,7 +78,8 @@ extension LNPopupView {
     private func setupViews() {
         backgroundView.onTap { [weak self] in
             guard let self else { return }
-            if LNKeyboardManager.shared.isEditing {
+            if !ignoreKeyboardToDismiss,
+               LNKeyboardManager.shared.isEditing {
                 endEditing(true)
             } else if touchOutsideToCancel {
                 if let onTouchOutside {

+ 1 - 1
Lanu/Views/Profile/Feed/LNCreateFeedViewController.swift

@@ -191,7 +191,7 @@ extension LNCreateFeedViewController {
                 if let image {
                     let imageView = buildImageView()
                     imageView.uploadImage(image: image)
-                    photosView.insertArrangedSubview(imageView, at: 1)
+                    photosView.insertArrangedSubview(imageView, at: photosView.arrangedSubviews.count - 1)
                     imageView.snp.makeConstraints { make in
                         make.width.equalTo(imageView.snp.height)
                     }

+ 1 - 0
Lanu/Views/Profile/Feed/LNFeedCommentInputPanel.swift

@@ -43,6 +43,7 @@ extension LNFeedCommentInputPanel: UITextViewDelegate {
 extension LNFeedCommentInputPanel {
     private func setupViews() {
         container.layer.cornerRadius = 0
+        ignoreKeyboardToDismiss = true
         
         let stackView = UIStackView()
         stackView.axis = .horizontal

+ 1 - 0
Lanu/Views/Profile/Feed/LNFeedCommentListPanel.swift

@@ -207,6 +207,7 @@ extension LNFeedCommentListPanel {
         tableView.showsHorizontalScrollIndicator = false
         tableView.separatorStyle = .none
         tableView.dataSource = self
+        tableView.allowsSelection = false
         
         let header = MJRefreshNormalHeader { [weak self] in
             guard let self else { return }

+ 55 - 35
Lanu/Views/Profile/Feed/LNImageFeedDetailViewController.swift

@@ -85,6 +85,35 @@ extension LNImageFeedDetailViewController {
             }
         }
     }
+    
+    private func toComment(checkScroll: Bool = true) {
+        guard let curDetail else { return }
+        if checkScroll, !scrollToComment() {
+            return
+        }
+        
+        let panel = LNFeedCommentInputPanel()
+        panel.handler = { [weak self] comment in
+            guard let self else { return }
+            LNFeedManager.shared.sendFeedComment(id: curDetail.id, content: comment) { [weak self] success in
+                guard let self else { return }
+                guard success else { return }
+                
+                let item = LNFeedCommentVO()
+                item.avatar = myUserInfo.avatar
+                item.nickname = myUserInfo.nickname
+                item.textContent = comment
+                item.createdAt = Int(curTime * 1_000)
+                comments.insert(item, at: 0)
+                tableView.reloadSections(.init(integer: 1), with: .automatic)
+                
+                curDetail.commentCount += 1
+                commentLabel.text = "\(curDetail.commentCount)"
+                LNFeedManager.shared.notifyFeedCommentChanged(id: curDetail.id, count: curDetail.commentCount)
+            }
+        }
+        panel.popup()
+    }
 }
 
 extension LNImageFeedDetailViewController: UITableViewDataSource, UITableViewDelegate {
@@ -149,6 +178,29 @@ extension LNImageFeedDetailViewController: UITableViewDataSource, UITableViewDel
 }
 
 extension LNImageFeedDetailViewController {
+    private func scrollToComment() -> Bool {
+        if curDetail?.commentCount == 0 {
+            return true
+        }
+        if tableView.contentOffset.y
+            + tableView.bounds.height
+            + tableView.contentInset.top
+            > tableView.contentSize.height - 50 {
+            return true
+        }
+        
+        let rect = tableView.rectForHeader(inSection: 1)
+        let convertedRect = tableView.convert(rect, to: tableView.superview)
+        
+        if convertedRect.minY - 50 <= tableView.bounds.minY + tableView.contentInset.top {
+            return true
+        }
+        
+        let indexPath = IndexPath(row: 0, section: 1)
+        tableView.scrollToRow(at: indexPath, at: .top, animated: true)
+        return false
+    }
+    
     private func setupViews() {
         setupNavBar()
         
@@ -269,28 +321,7 @@ extension LNImageFeedDetailViewController {
         let container = UIView()
         container.onTap { [weak self] in
             guard let self else { return }
-            guard let curDetail else { return }
-            let panel = LNFeedCommentInputPanel()
-            panel.handler = { [weak self] comment in
-                guard let self else { return }
-                LNFeedManager.shared.sendFeedComment(id: curDetail.id, content: comment) { [weak self] success in
-                    guard let self else { return }
-                    guard success else { return }
-                    
-                    let item = LNFeedCommentVO()
-                    item.avatar = myUserInfo.avatar
-                    item.nickname = myUserInfo.nickname
-                    item.textContent = comment
-                    item.createdAt = Int(curTime * 1_000)
-                    comments.insert(item, at: 0)
-                    tableView.reloadSections(.init(integer: 1), with: .automatic)
-                    
-                    curDetail.commentCount += 1
-                    commentLabel.text = "\(curDetail.commentCount)"
-                    LNFeedManager.shared.notifyFeedCommentChanged(id: curDetail.id, count: curDetail.commentCount)
-                }
-            }
-            panel.popup()
+            toComment()
         }
         
         let commentIc = UIImageView()
@@ -351,19 +382,7 @@ extension LNImageFeedDetailViewController {
         container.layer.cornerRadius = 19
         container.onTap { [weak self] in
             guard let self else { return }
-            guard let curDetail else { return }
-            let panel = LNFeedCommentInputPanel()
-            panel.handler = { [weak self] comment in
-                guard let self else { return }
-                LNFeedManager.shared.sendFeedComment(id: curDetail.id, content: comment)
-                { [weak self] success in
-                    guard let self else { return }
-                    guard success else { return }
-                    curDetail.commentCount += 1
-                    commentLabel.text = "\(curDetail.commentCount)"
-                }
-            }
-            panel.popup()
+            toComment(checkScroll: false)
         }
         container.snp.makeConstraints { make in
             make.height.equalTo(38)
@@ -401,6 +420,7 @@ extension LNImageFeedDetailViewController {
         tableView.separatorStyle = .none
         tableView.dataSource = self
         tableView.delegate = self
+        tableView.allowsSelection = false
         
         let footer = MJRefreshAutoNormalFooter { [weak self] in
             guard let self else { return }

+ 2 - 2
Lanu/Views/Profile/Feed/LNVideoFeedDetailViewController.swift

@@ -118,7 +118,7 @@ extension LNVideoFeedDetailViewController: LNVideoPlayerViewDelegate {
     }
     
     func onVideoProgressChanged(view: LNVideoPlayerView, cur: Float64, total: Float64) {
-        seekBar.value = Float(cur)
+        seekBar.setValue(Float(cur), animated: true)
     }
 }
 
@@ -313,7 +313,7 @@ extension LNVideoFeedDetailViewController {
             LNFeedManager.shared.likeFeed(id: curDetail.id) { [weak self] res in
                 guard let self else { return }
                 guard let res else { return }
-                likeIc.image = res.like ? .icLikeEmpty.withTintColor(.text_1, renderingMode: .alwaysOriginal) : .icLikeEmpty
+                likeIc.image = res.like ? .icLikeFilled : .icLikeEmpty.withTintColor(.text_1, renderingMode: .alwaysOriginal)
             }
         }