我对UIViews
的设置方式有疑问。
场合
我认为我会添加一些细节视图。这些详细视图按顺序排列,非常类似于UITableView
的行。这实际上是一个非常好的比较。不同之处在于,在这种观点中,我们不是上下滚动而是横向滚动。
在这些详细视图中,屏幕上始终只有一个。当我添加第一个屏幕时,我也会加载下一个屏幕(向右)并将其绘制到屏幕外(再次向右)。当用户点击按钮时,我们会在下一个带有小动画的视图之前。最后一个可见视图向左滑动,从右侧滑出第二个视图。此时,我保留对现在左侧视图的引用,并加载一个新的右视图,如果有的话。我创建了一个协议,使任何其他对象成为我称之为SlidableDetailViewController
(SDVC
)的数据源。
目前,我在数据源didSet
期间配置详细信息视图。在此设置期间,它会生成这三个帧(同样,左,中,右)。
问题
当视图加载并首次出现在屏幕上时,中心视图的框架不是它应该是的,而是更小。第二个详细视图将正确显示。当我回到第一个时,框架也会更新并更正。
当我调试它时,帧被计算并正确设置。当我进入viewWillAppear(_:)
时,即使是视图的框架也是我所期待的。当我在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)
}
加载下一个视图(加载上一个视图的工作原理大致相同):
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
}
}
}
谢谢!
答案 0 :(得分:0)
我可以使用rob mayoff建议的普通UIPageViewController
解决此问题。