ios - 使用动画更改 CollectionView 位置,但在第一次滚动时向后移动
问题描述
我想collectionView
在按下按钮时改变我的位置。collectionView
我将and包裹Button
在 a 中View
,并使用 UIView animate 使其向上移动。它可以成功向上移动,但是当我滚动它时collectionView
,它又回到了原来的位置。如果我尝试了很多次,它就变得正常了,并且没有再次移动。
我该如何解决这个问题?谢谢你的任何建议。
func openPreview() {
if !isPreviewOpened {
UIView.animate(withDuration: 0.3) {
self.previewView.frame.origin.y -= self.previewView.frame.height
self.previewButton.frame.origin.y -= self.previewView.frame.height
}
isPreviewOpened = true
updateUI()
}
func closePreview() {
if isPreviewOpened {
UIView.animate(withDuration: 0.3) {
self.previewView.frame.origin.y += self.previewView.frame.height
self.previewButton.frame.origin.y += self.previewView.frame.height
}
isPreviewOpened = false
updateUI()
}
}
解决方案
在问过别人之后,提供我对这个问题的解决方案,希望它可以帮助将来的人。
发生此问题是因为我更改的框架与我之前在情节提要中设置的自动布局冲突。根据文档,我必须将 translatesAutoresizingMaskIntoConstraints 设置为 true 才能跟踪帧。
默认情况下,视图上的自动调整掩码会产生完全确定视图位置的约束。这允许自动布局系统跟踪手动控制布局的视图框架(例如,通过 -setFrame:)。当您选择通过添加自己的约束来使用自动布局定位视图时,您必须将此属性设置为 NO。IB会为你做这件事。
所以这就是答案。
func openPreview() {
if !isPreviewOpened {
previewView.translatesAutoresizingMaskIntoConstraints = true
UIView.animate(withDuration: 0.3) {
self.previewView.frame.origin.y = self.view.bounds.maxY - self.previewView.frame.height
self.previewButton.frame.origin.y = self.view.bounds.maxY - self.previewView.frame.height - self.previewButton.frame.height
}
}
}
推荐阅读
- ios - 如何在collectionView中嵌入一些具有不同数据的tableView?
- vue.js - Vue.js--vue cli3 更改网站图标不起作用
- javascript - 在 AJAX 调用成功响应时将数据推送到数组中会导致多次附加最后一个数据
- raku - 带有内存的标量,或者如何正确地“绑定”
- function - 如何在 R 中绘制具有均匀分布的 3-D 联合密度函数
- android - 如何使用 Intent.ACTION_OPEN_DOCUMENT 过滤 JSON 文件?
- reactjs - 如何将 SVG 源解析为 React 节点?
- javascript - 数组的长度属性在 for 循环中无法正常工作
- google-apps-script - 我无法让 Math.max 函数仅返回有效整数#num
- php - 我的 php 文件中的重定向有问题