我有一个“UIProgressView”和3点视图。它就像一个页面控件。每一页-视频。“progressView”显示视频播放的进度
好的。我没有对左右锚点使用约束,因为我的progressView应该与点视图交换位置。例如,当当前视频结束,下一个开始播放时,我们应该与下一个点视图交换“progressView”的位置。对于交换,我只是改变帧
问题是当我将应用程序移到后台并返回时,我的“progressView”丢失了它的旧帧。它附加到左侧,因为“.frame.minX”为0
还有最后一个此问题仅在首次从后台返回后发生
我想做的是
- 在应用程序进入后台之前保存
progressView
帧,并在应用程序进入前台时恢复:progressView.frame = progressViewOldFrames
并调用setNeedsDisplay()
- 在背景前用常量(
frame.minX
)锚定并在前景后删除 - 合并这两次尝试
所以现在看来
func appWillMoveInBackground() {
progressBarXConstraint = progressBar.leftAnchor.constraint(equalTo: self.leftAnchor, constant: progressBar.frame.minX)
progressBarXConstraint?.isActive = true
progressBarFrame = progressBar.frame
}
func updateProgressWidth() {
progressBarXConstraint?.isActive = false
// here i use constraints because my width and height also disables
// and only constraints helps me
progressBar.widthAnchor.constraint(equalToConstant: 32).isActive = true
progressBar.heightAnchor.constraint(equalToConstant: 6).isActive = true
progressBar.frame = progressBarFrame
progressBar.setNeedsDisplay()
}
更新好,我应该解释更多。我想我不能使用约束,因为我们有一些动画,而我们正在滚动。当我们滚动到右边-我们应该移动我们的progressView
到一些点在右边。在这一刻,我们应该移动右点视图到左边。我的意思是,我们不滚动一页一页,我们可以滚动到一半的权利,然后我们可以回到初始位置。
这段代码确实改变了progressView和dot-view的框架。2公式并不重要。3请理解这个视图的行为
func scrollViewDidScroll(_ scrollView: UIScrollView) {
// calc some math variables
// and call method that make changes in frames
pageControl.moveBetweenPages(atPercentValue: distInPercents - 100)
}
// its part of body moveBetweenPages() func
progressBar.frame = CGRect(x: progStartX + progAddDist, y: 0,
width: SizeConstants.progressBarWidth.value,
height: SizeConstants.height.value)
let dotStartX: CGFloat = SizeConstants.progressBarWidth.value + SizeConstants.itemsSpacing.value + (CGFloat(currentPageNum) * dotSectionSize)
dots[currentPageNum].view.frame = CGRect(x: dotStartX - dotAddDist, y: 0,
width: SizeConstants.dotWidth.value,
height: SizeConstants.height.value)
图像显示了它在使用背景之前和使用x1c 0d1x之后的外观
1条答案
按热度按时间xqnpmsa81#
matt从评论中建议我使用
constraints
而不是框架,是的,这很有帮助,也很有效我唯一能说的是不要忘记在约束更新后调用
setNeedsLayout()