gpt4 book ai didi

ios - UIView 的框架被随机覆盖

转载 作者:行者123 更新时间:2023-11-30 13:51:39 32 4
gpt4 key购买 nike

我的方式有问题UIViews已设置。

情况

我有一个 View ,我将向其中添加一些详细 View 。这些详细 View 按顺序排列,就像 UITableView 的行一样。是。这实际上是一个很好的比较。不同之处在于,在此 View 中我们不是上下滚动,而是横向滚动。

在这些详细 View 中,屏幕上始终只有一个。当我添加第一个屏幕时,我还会加载下一个屏幕(向右)并将其绘制出屏幕(再次向右)。当用户点击按钮时,我们会使用小动画进入下一个 View 。最后一个可见 View 向左滑出,第二个 View 从右侧滑入。此时,我保留对现在左侧 View 的引用,并加载一个新的右侧 View (如果有)。我创建了一个协议(protocol),使任何其他对象成为我所说的 SlidableDetailViewController 的数据源。 (SDVC)。

目前,我在数据源的 didSet 期间配置详细 View 。在此设置过程中,它会生成这三个帧(同样是左、中、右帧)。

问题

当 View 加载并首次出现在屏幕上时,中心 View 的框架不是应有的样子,而是小得多。第二个详细 View 将正确显示。当我返回到第一个时,框架也会更新并正确。

当我调试它时,帧被计算并正确设置。当我闯入viewWillAppear(_:) ,甚至 View 的框架也是我所期望的。当我在viewDidAppear(_:)中做同样的事情时它已经缩小到没人想要的奇怪尺寸。我并没有在其中做任何事情;我只是用它们来调试这里的代码。

有人看到我在这里做错了什么吗?

我很确定这只是我的愚蠢错误,但我现在无法弄清楚。

代码示例更新

计算帧:

private func calculateFrames() {
// Get the size for our views from the dataSource.
let detailViewSize: CGSize
if let theDataSource = dataSource {
detailViewSize = theDataSource.detailViewSize()
} else {
// Just use a few default values.
detailViewSize = CGSizeMake(320, 185)
}

// Calculate the frame for on screen display.
let detailFrameX = (view.frame.width - detailViewSize.width) / 2
let detailFrameY = (view.frame.height / 2 - detailViewSize.height / 2)
centerFrame = CGRectMake(detailFrameX, detailFrameY, detailViewSize.width, detailViewSize.height)

// The other two frames are basically just offsets of the original centerFrame.
leftFrame = centerFrame?.offsetBy(dx: (detailViewOffset * -1), dy: 0.0)
rightFrame = centerFrame?.offsetBy(dx: detailViewOffset, dy: 0.0)
}

加载下一个 View (加载上一个 View 的工作方式几乎相同):

func showNextDetailView() {
// 1. If we're at the last item, we can't advance.
if selectedIndex == detailsCount() - 1 {
return
}

// 2. Check if there is a view on the left spot
if leftView != nil {
// 2.1. … if so, remove it from superView.
leftView?.removeFromSuperview()
}

UIView.animateWithDuration(animationDuration, delay: 0.0, options: .CurveEaseInOut, animations: { () -> Void in
// 3. Set the frame of the view at selectedIndex to leftFrame.
self.centerView?.frame = self.leftFrame!
// 4. Set the frame of the view at selectedIndex + 1 to center frame.
self.rightView?.frame = self.centerFrame!
}) { (finished) -> Void in
print("animation to next detail view finished")
}

// 5. Increase the selectedIndex
selectedIndex++

// Store the new positions for quick reference.
if let theDataSource = dataSource {
if let newLeftView = theDataSource.detailViewAtIndex(selectedIndex - 1) {
leftView = newLeftView
}

if let newCenterView = theDataSource.detailViewAtIndex(selectedIndex) {
centerView = newCenterView
}

// 6. Check if we have more views left
if detailsCount() - 1 > selectedIndex {
// 6.1 … and if so, add a new one to the right.
rightView = theDataSource.detailViewAtIndex(selectedIndex + 1)
rightView?.frame = rightFrame!
contentView.addSubview(rightView!)
} else {
rightView = nil
}
}
}

谢谢!

最佳答案

按照 rob Mayoff 的建议,我能够使用普通的 UIPageViewController 修复此问题。

关于ios - UIView 的框架被随机覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34203983/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com