UIView的框架被随机覆盖

时间:2015-12-10 14:07:58

标签: ios swift uiview uiviewcontroller uiview-hierarchy

我对UIViews的设置方式有疑问。

场合

我认为我会添加一些细节视图。这些详细视图按顺序排列,非常类似于UITableView的行。这实际上是一个非常好的比较。不同之处在于,在这种观点中,我们不是上下滚动而是横向滚动。

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

目前,我在数据源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
        }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

我可以使用rob mayoff建议的普通UIPageViewController解决此问题。