iOS 【如何解決 UIView 在佈局時的"詭異"動畫效果】
場景
在專案中,UIView 的佈局時,發生了詭異的動畫效果。演示視訊如下:
根本
看到官方文件中的一句話:
// animatable. do not use frame if view is transformed since it will not correctly reflect the actual location of the view. use bounds + center instead.
open var frame: CGRect
含義:frame 是可以使用動畫的。如果檢視發生了形變,則不要使用 frame,因為它不能正確反映檢視的實際位置。使用 bounds + center 代替。
通俗的講就是 frame 發生改變時是不能使用動畫的。
原因一
在視訊的場景中,點選輸入框,撥出鍵盤,由於鍵盤的彈出遮擋住了部分聊天介面,所以我們讓 ① 底部的聊天氣泡列表(UITableView)緩緩上移。此時恰巧使用者在瀏覽歷史聊天記錄,那麼我們預設是要讓 ② 聊天氣泡列表滾動到最近的一條氣泡資訊的(類似 WeChat 的效果),在滾動的過程中,cell 發生了重用,佈局(frame)隨之發生了變化。
上述事件中,藍色文字按閱讀順序恰好滿足了“詭異”動畫產生的兩個重要因素:① 產生了動畫效果;② frame 發生了改變。
解決一
首先我們看一下兩個重要因素的產生程式碼:
// ① table 整體上移
self.letterDetailTable.transform = CGAffineTransform(translationX: 0, y: -move_h)
// ② table 滾動到最後一行
letterTable.scrollToRow(at: IndexPath(item: letterDetailVMArr.count - 1, section: 0), at: UITableViewScrollPosition.bottom, animated: false)
實際上這兩個因素共同導致了問題的發生,那麼我們完全可以控制其中一個不再出現。
要麼讓動畫不執行,要麼讓 frame 不發生改變。
但是 cell 的滾動,佈局肯定要重新整理,所以 cell 的 frame 一定會發生改變,那麼就只能讓動畫不執行。我嘗試去關閉這個過程的動畫。
我首先將 程式碼① 不執行。然後執行程式,發現單單保留 程式碼② 也可以出現之前的詭異動畫。
懷疑
文件的描述不會錯,也就是 程式碼②? 即存在 frame 的改變,也存在動畫的執行,但是該方法我已經將動畫屬性置為 false,動畫是從何而來?
open func scrollToRow(at indexPath: IndexPath, at scrollPosition: UITableViewScrollPosition, animated: Bool)
原因二
其實每一個 UIView 都預設關聯一個 CALayer,我們將這個 layer 認為是 root layer。而所有的非 root layer 都有存在預設的隱式動畫,隱式動畫預設是 0.25s。
在執行上面 程式碼② 時,cell 上面的子控制元件隱式動畫開啟,而 frame 也在實時發生的重新整理,這才是詭異動畫產生的真實原因。
解決二
/* Accessors for the "disableActions" per-thread transaction property.
* Defines whether or not the layer's -actionForKey: method is used to
* find an action (aka. implicit animation) for each layer property
* change. Defaults to NO, i.e. implicit animations enabled. */
open class func disableActions() -> Bool
open class func setDisableActions(_ flag: Bool)
CATransaction.begin() // 1
CATransaction.setDisableActions(true) // 2 關閉layer隱式動畫
// 滾動到最後一行
scrollToRow(at: IndexPath(item: letterDetailVMArr.count - 1, section: 0), at: UITableViewScrollPosition.bottom, animated: false)
CATransaction.commit() // 3
相關文章
- iOS UIView基本動畫iOSUIView動畫
- VC的佈局時機、所用方法以及UIView內部佈局執行順序UIView
- 系統學習iOS動畫之二:自動佈局iOS動畫
- iOS動畫-擴散波紋效果iOS動畫
- iOS自動佈局——Masonry詳解iOS
- IOS下box-shadow的詭異bug的修復iOS
- Flutter學習之佈局、互動、動畫Flutter動畫
- 鴻蒙HarmonyOS實戰-ArkUI動畫(佈局更新動畫)鴻蒙UI動畫
- 使用 Arthas 排查 SpringBoot 詭異耗時的 BugSpring Boot
- iOS動畫專題·UIView二維形變動畫與CAAnimation核心動畫(transform動畫,基礎,關鍵幀,組動畫,路徑動畫,貝塞爾曲線)iOS動畫UIViewORM
- 串列埠使用Pipeline時詭異的ReadOnlySequence問題串列埠
- iOS動畫系列之二:帶時分秒指標的時鐘動畫(下)iOS動畫指標
- 如何解決input遇到fixed,absolute佈局出現的問題
- css3動畫效果抖動解決CSSS3動畫
- iOS UIView漸變色iOSUIView
- JavaScript時間輪盤:js元素圓形佈局製作時間輪盤動畫JavaScriptJS動畫
- 詭異的”慢查詢“
- Swift iOS : 使用Cartography佈局SwiftiOS
- iOS Flexbox 佈局優化iOSFlex優化
- flutter佈局-8-animated_icons動畫圖片Flutter動畫
- 一個詭異的 Pulsar InterruptedException 異常Exception
- 浮動佈局 和 flex佈局Flex
- iOS 中 UIView 和 CALayer 的關係iOSUIView
- 8 個出沒在 Linux 終端的詭異傢伙Linux
- 【iOS】關於 UICollectionView 的自定義佈局iOSUIView
- iOS 常用佈局方式之ConstraintiOSAI
- jQuery 效果 – 動畫jQuery動畫
- 【佈局進階】巧用 :has & drop-shadow 實現複雜佈局效果
- 佈局的常用解決方案
- 這是一篇很好的互動式文章,Framer Motion 佈局動畫動畫
- iOS 動畫iOS動畫
- iOS動畫效果合集、飛吧企鵝遊戲、換膚方案、畫板、文字效果等原始碼iOS動畫遊戲原始碼
- 移動佈局基礎之 流式佈局
- CSS3實現王者匹配時的粒子動畫效果CSSS3動畫
- jQuery 動畫效果 與 動畫佇列jQuery動畫佇列
- JS動畫效果——多物體動畫JS動畫
- JavaScript簡單的動畫效果JavaScript動畫
- iOS UICollectionView 橫向分頁佈局iOSUIView