iOS开发之微信聊天工具栏的封装

iOS开发之微信聊天工具栏的封装攻略

简介

在iOS开发中,设计友好、交互流畅、体验优秀的聊天工具栏是一项非常重要的任务。本文将分享一个针对微信聊天工具栏的封装方案,让你轻松实现高质量的聊天界面。

步骤

步骤1:创建工程

在Xcode中创建一个新的工程,并在项目中添加一个消息界面。

步骤2:设计界面

在消息界面中,创建聊天输入框。这里我们将使用开源框架TPKeyboardAvoiding实现输入框自动上移。

实现代码如下:

let chatInputView = ChatInputView(frame: CGRect(x: 0, y: view.bounds.height - 50, width: view.bounds.width, height: 50))
chatInputView.delegate = self
chatInputView.backgroundColor = UIColor(white: 0.97, alpha: 1)
chatInputView.autoresizingMask = .flexibleHeight
view.addSubview(chatInputView)

步骤3:实现聊天功能

实现聊天功能并将消息显示在视图中。此处可以使用开源框架JSQMessagesViewController,在GitHub上有很多示例代码。

步骤4:封装工具栏

在实现了基本的聊天功能后,我们需要将聊天工具栏进行封装,这样可以提高代码的重用性,使聊天功能更加模块化。

以下是示例:封装了文本、语音两个功能的聊天工具栏。

ChatInputView

class ChatInputView: UIView, UITextViewDelegate, VoiceButtonDelegate {

    var textView: ChatTextView! // 消息文本框
    var voiceButton: VoiceButton! // 按住说话按钮
    var faceButton: UIButton! // 表情按钮
    var moreButton: UIButton! // 更多按钮
    var bottomLine: UIView! // 工具栏底部的线

    weak var delegate: ChatInputViewDelegate?

    override init(frame: CGRect) {
        super.init(frame: frame)

        backgroundColor = UIColor.white

        bottomLine = UIView(frame: CGRect(x: 0, y: 0, width: bounds.width, height: 0.5))
        bottomLine.autoresizingMask = .flexibleWidth
        bottomLine.backgroundColor = UIColor(white: 0.85, alpha: 1)
        addSubview(bottomLine)

        textView = ChatTextView(frame: CGRect(x: 8, y: 8, width: bounds.width - 16 - 40 - 36 - 8, height: bounds.height - 8 - 8))
        textView.delegate = self
        addSubview(textView)

        faceButton = UIButton(type: .custom)
        faceButton.frame = CGRect(x: bounds.width - 8 - 36 * 3 - 4 * 2, y: bounds.height - 8 - 36, width: 36, height: 36)
        faceButton.autoresizingMask = [.flexibleLeftMargin, .flexibleTopMargin]
        faceButton.setImage(#imageLiteral(resourceName: "chat_bottom_smile_normal"), for: .normal)
        faceButton.setImage(#imageLiteral(resourceName: "chat_bottom_smile_highlight"), for: .highlighted)
        addSubview(faceButton)

        moreButton = UIButton(type: .custom)
        moreButton.frame = CGRect(x: bounds.width - 8 - 36 * 2 - 4 * 1, y: bounds.height - 8 - 36, width: 36, height: 36)
        moreButton.autoresizingMask = [.flexibleLeftMargin, .flexibleTopMargin]
        moreButton.setImage(#imageLiteral(resourceName: "chat_bottom_more_normal"), for: .normal)
        moreButton.setImage(#imageLiteral(resourceName: "chat_bottom_more_highlight"), for: .highlighted)
        addSubview(moreButton)

        voiceButton = VoiceButton(frame: CGRect(x: bounds.width - 8 - 36 - 40, y: bounds.height - 8 - 36, width: 40, height: 36))
        voiceButton.autoresizingMask = [.flexibleLeftMargin, .flexibleTopMargin]
        voiceButton.delegate = self
        addSubview(voiceButton)
    }

...

}

VoiceButton

protocol VoiceButtonDelegate: class {
    func voiceButtonDidBeginRecord(_ button: VoiceButton, completion: ((Bool) -> Void)?)
    func voiceButtonDidEndRecord(_ button: VoiceButton, completion: ((Bool) -> Void)?)
    func voiceButtonDidCancelRecord(_ button: VoiceButton)
    func voiceButtonDidDragInside(_ button: VoiceButton)
    func voiceButtonDidDragOutside(_ button: VoiceButton)
}

class VoiceButton: UIButton {

    weak var delegate: VoiceButtonDelegate?
    var shouldStopRecording = false

    override init(frame: CGRect) {
        super.init(frame: frame)

        backgroundColor = UIColor.white
        layer.cornerRadius = 10
        layer.borderWidth = 0.5
        layer.borderColor = UIColor.lightGray.cgColor
        setImage(#imageLiteral(resourceName: "chat_bottom_voice_normal"), for: .normal)
        setImage(#imageLiteral(resourceName: "chat_bottom_voice_highlight"), for: .highlighted)
        addTarget(self, action: #selector(handleTouchDown), for: .touchDown)
        addTarget(self, action: #selector(handleTouchUpOutside), for: .touchUpOutside)
        addTarget(self, action: #selector(handleTouchUpInside), for: .touchUpInside)
        addTarget(self, action: #selector(handleTouchDragInside), for: .touchDragInside)
        addTarget(self, action: #selector(handleTouchDragOutside), for: .touchDragOutside)
    }

...

}

步骤5:完善界面

在聊天界面中,通过实例化ChatInputView并添加到视图中,即可完成聊天工具栏的展示。

let chatInputView = ChatInputView(frame: CGRect(x: 0, y: view.bounds.height - 50, width: view.bounds.width, height: 50))
chatInputView.delegate = self
chatInputView.backgroundColor = UIColor(white: 0.97, alpha: 1)
chatInputView.autoresizingMask = .flexibleHeight
view.addSubview(chatInputView)

结语

以上是封装微信聊天工具栏的完整攻略,在本文中,我们使用了开源框架等多种技术手段,希望对你在实现聊天界面上有所帮助。若仍有疑问,欢迎在评论区留言。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:iOS开发之微信聊天工具栏的封装 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • Vue业务组件封装Table表格示例详解

    下面我会为你详细讲解“Vue业务组件封装Table表格示例详解”的完整攻略。 简介 在实际开发中,我们经常会遇到需要使用表格来呈现数据的场景。在Vue框架中,我们可以使用一些UI库中的表格组件,比如Element UI中的el-table组件。但是,在实际项目中,我们可能会需要自定义一些表格的样式或功能,这时候就需要对表格进行封装。本文就是为大家详细讲解如何…

    other 2023年6月25日
    00
  • 怎么压缩文件?

    当需要传输、备份大量文件时,我们可能会使用文件压缩技术将这些文件归档为一个压缩文件,在保证数据完整性的前提下,减小文件的大小,提高传输、备份效率。下面是如何压缩文件的攻略: 1. 选择压缩工具 常见的文件压缩工具有WinRAR、7-Zip、WinZip等,这里以WinRAR为例进行说明。WinRAR是一个收费软件,但是有一个试用期可以免费使用。 2. 打开W…

    其他 2023年4月16日
    00
  • 原生js自定义右键菜单

    了解了您的需求,我针对“原生js自定义右键菜单”的完整攻略,提供如下讲解。 1. 添加右键菜单的基本思路 我们可以通过在DOM元素上绑定鼠标右击事件,再利用CSS样式和JavaScript代码控制菜单的显示和隐藏。 具体的实现步骤如下: 监听鼠标右击事件 创建一个div元素用于显示菜单,将其样式设置为隐藏 在监听函数中,获取右击位置的坐标,并将菜单显示在该位…

    other 2023年6月25日
    00
  • 电脑里的鼠标右键菜单的设置方法介绍

    电脑里的鼠标右键菜单的设置方法介绍 什么是右键菜单 鼠标是我们电脑操作的重要工具之一,而鼠标右键则是鼠标的一个重要功能,可以弹出一个菜单,我们称之为“右键菜单”或者“上下文菜单”。当我们点击鼠标右键时,这个菜单就会弹出来,里面包含了一些与所选对象相关的操作,比如复制、粘贴、打印等。鼠标右键菜单是我们使用电脑时经常使用的功能之一,对于经常使用鼠标的人来说,如果…

    other 2023年6月27日
    00
  • C++实现LeetCode(108.将有序数组转为二叉搜索树)

    C++实现LeetCode(108.将有序数组转为二叉搜索树)攻略 题目描述 给定一个有序整数数组,转换为高度平衡的二叉搜索树。 示例 1: 输入: [-10,-3,0,5,9] 输出: 0 / \ -3 9 / / -10 5 示例 2: 输入: [1,3] 输出: 3 / 1 题目分析 这道题目需要将有序整数数组转换为二叉搜索树,要求转换后的二叉树是平衡…

    other 2023年6月27日
    00
  • burpsuite的使用(一)

    BurpSuite的使用(一) BurpSuite是一款常用的Web应用安全测试工具,同时也是将安全问题演示给开发者、渗透测试人员等人员的必备工具之一。本文将介绍BurpSuite的基本使用方法:如何使用代理拦截请求,发送请求并对响应进行分析等操作。 下载与安装 BurpSuite官方网站:https://portswigger.net/burp/commu…

    其他 2023年3月28日
    00
  • windows11怎么显示文件后缀名? win11显示后缀名的两种方法

    在Windows 11中,你可以通过以下两种方法来显示文件的后缀名: 方法一:使用文件资源管理器 打开文件资源管理器。你可以通过点击任务栏上的文件夹图标或者按下Win + E快捷键来打开。 在文件资源管理器中,点击顶部菜单栏的\”查看\”选项。 在\”查看\”选项卡中,找到\”文件名扩展名\”这一栏。 确保\”文件名扩展名\”的复选框是选中状态。如果没有选中…

    other 2023年8月5日
    00
  • Android NestedScrolling嵌套滚动的示例代码

    Android NestedScrolling嵌套滚动的示例代码攻略 嵌套滚动是指在一个滚动容器内部,可以嵌套另一个滚动容器,并且两者可以同时进行滚动。Android提供了NestedScrolling机制来实现这种嵌套滚动的效果。下面是一个详细的攻略,包含了示例代码和说明。 步骤1:在XML布局文件中定义嵌套滚动的容器 首先,在XML布局文件中定义一个嵌套…

    other 2023年7月28日
    00
合作推广
合作推广
分享本页
返回顶部