基于Texture的聊天应用程序
Texture를이용한ChatKit만들었다。 정말기능만
。다른이브러리들도해봤었다。
mukyasa / MMTextureChat
MMTextureChat –用于 Whatsapp 和iMessage的 AsyncDisplayKit (Texture)平滑滚动聊天模拟 github.com MessageKit /消息包
MessageKit –开发中:JSQMessagesViewController社区驱动的替代品 github.com nguyenhuy / AsyncMessagesViewController
AsyncMessagesViewController –适用于iOS的平滑,响应和灵活的消息UI库。 github.com slackhq / SlackTextViewController
SlackTextViewController –带有不断增长的文本输入视图和其他有用消息传递的嵌入式UIViewController子类…… github.com
생각한이있었는데,내가생각한聊天应用程序라이브러리에서가핵심적인능은
- 追加,追加용이해야한다。
- 前置스때유이유지되야하고사용자좋아야한이좋아야한다。
- 消息输入UI를이기가용이해야한다。
Diff算法Diff算法,网络,网络,网络和应用程序。
聊天应用程序능들과기부부가적으로능들기능들이많다。
GTChatKit产品和服务GTGhatKit产品。
용법을먼저먼저
- class기子类
类ChatNodeController:GTChatNodeController {...}
请参见GTChatNodeController子类。
그냥리。이같初始化그냥이다。
让viewController = ChatNodeController()
그리고가능한로퍼티자면보자면보간단히
类ChatNodeController:GTChatNodeController {
...
func foo(){
let collectionView = self.chatNode // chatNode等于UICollectionView
让backgroundView = self.node // self.node等于backgroundView(UIView)
}
}
chatNode节点的名称。 。이주석과다。 chatNode节点中的nodeNode节点。 消息输入UI界面浮动UI界面。
2. GTChatNodeDelegate实现
扩展ChatNodeController:GTChatNodeDelegate {
func shouldAppendBatchFetch(用于chatNode:ASCollectionNode)-> Bool {
//应该追加批量提取
返回真
}
func shouldPrependBatchFetch(for chatNode:ASCollectionNode)-> Bool {
//应该在批量提取之前
返回真
}
func chatNode(_ chatNode:ASCollectionNode,willBeginAppendBatchFetchWith context:ASBatchContext){
//网络呼叫处理
//如果网络呼叫已完成,则上下文应完成
//必需的示例
//例如)self.completeBatchFetching(true,endDirection:.none)
}
func chatNode(_ chatNode:ASCollectionNode,willBeginPrependBatchFetchWith context:ASBatchContext){
...
}
}
위에서부터하나씩말하자면
- 追加提取内容。
- 预先获取数据。
- 附加대한网络끝나면기서끝나면completeBatchFetching된된다。
- prepend대한Network콜을사용자가작성한다。
分页页面分类LeadingScreensForBatching下载(默认显示纹理2)
与之比较complateBatchFetching与上下文相关的内容:ASBatchContext与网络关系表이나collection和reload
context.complateBatchFetching(true)
滚动운운음음운운운etch etch시시시된된된된。
完整的批处理提取方法。
func completeBatchFetching(_已编译:布尔,endDirection:BatchFetchDirection){...}
endDirection:自动阻止追加或添加批处理
self.completeBatchFetching(true,endDirection:.append)->没有更多的附加操作无效
self.completeBatchFetching(true,endDirection:.prepend)->没有更多的前置项不起作用
Direct endDirection여기에3가지상태가있다
- 附加
- 前置
- 没有
은의미고없는는는의미고의미고와와와없/ / / / / / /않겠는는。。
및호불호적인적인적인적인적인적인및및및및나누고면면면면면면면면면면면작업하고작업하고작업하고작업하고
self.isPagingStatusEnable = false
已关闭isPagingStatusEnable。
능을리고기능을사능을다면
self.pagingStatus
로상태인상태인상태인수가있다。
이걸사용한다면
func collectionNode(_ collectionNode:ASCollectionNode,numberOfItemsInSection部分:Int)-> Int {
切换部分{
案例Section.prependIndicator.rawValue:
返回self.pagingStatus == .prepending? 1:0
案例Section.appendIndicator.rawValue:
返回self.pagingStatus == .appending吗? 1:0
案例Section.messages.rawValue:
返回self.items.count
默认值:返回0
}
}
加载指示器加载器部分。
(물론TableView였다면사页脚,页眉에다붙이는게정석이겠지만…)
3.在Texture-Intelligent-preloading上进行纹理贴图。
load기크따라서preload,显示된다。
打开func setupChatRangeTuningParameters(){
self.chatNode.setTuningParameters(ASRangeTuningParameters(leadingBufferScreenfuls:1.5,
TrailingBufferScreenfuls:1.5),
用于:.full,
rangeType:.display)
self.chatNode.setTuningParameters(ASRangeTuningParameters(leadingBufferScreenfuls:2,
TrailingBufferScreenfuls:2),
用于:.full,
rangeType:.preload)
}
使用GTChatKit,请使用方法重载。
4.使用LayoutSpecThatFits方法,可以使用TextureView或ASViewController的消息输入UI进行下载。
。이사용할작성했다。
覆盖func layoutSpecThatFits(_ constrainedSize:ASSizeRange,chatNode:ASCollectionNode)-> ASLayoutSpec {
让messageInsets:UIEdgeInsets = .init(top:.infinity,
左:0.0,
底部:self.keyboardVisibleHeight,
右:0.0)
让messageLayout = ASInsetLayoutSpec(insets:messageInsets,
子:self.messageNode)
//将消息输入框覆盖到chatNode上
让messageOverlayedLayout = ASOverlayLayoutSpec(child:chatNode,
覆盖:messageLayout)
返回ASInsetLayoutSpec(insets:.zero,child:messageOverlayedLayout)
}
默认值chatNode(ASCollectionNode)覆盖重写的对象。
。정리총다。
- 追加,追加
- 分页状态
- 운로운UI이식성
- 퍼포먼스(纹理가알아서)
- 在GTChatKit和FlowLayout之前添加。
솔직히지〜일〜〜〜〜다다다다다다다다다다다다다다다다〜〜。〜。