swift 当应用程序从后台启动时,UIProgressView不会重新绘制其框架

b4wnujal  于 2023-02-21  发布在  Swift
关注(0)|答案(1)|浏览(105)

我有一个“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之后的外观

xqnpmsa8

xqnpmsa81#

matt从评论中建议我使用constraints而不是框架,是的,这很有帮助,也很有效
我唯一能说的是不要忘记在约束更新后调用setNeedsLayout()

相关问题