Swift:如何在父视图的底部正确定位容器视图? (或者:除容器视图之外还有其他选项吗?)

时间:2017-10-09 15:29:37

标签: ios view uiviewcontroller

我还是swift的新手,我想做的是在父视图的下部放置一个容器视图(包含的一部分首先在视图之外)。然后,当用户触摸按钮时,容器被动画化并向上移动以便显示所有内容。

动画效果很好,但对我来说定位很困难。以下是我到目前为止所做的事情:

@IBOutlet var testView: UIView!
override func viewDidLoad() {
        super.viewDidLoad()

        testView.frame.size = CGSize(width: view.bounds.width, height: 400)
        testView.layer.position = CGPoint(x: view.frame.midX, y: view.frame.maxY + 90)
        view.addSubview(testView)
    }

所以我将容器视图设置为超视图的宽度,固定大小为400.我尝试将其定位在屏幕底部的中心位置,以便显示部分内容并且部分位于屏幕外部。

这是动画部分:

@IBAction func showMoreButton(_ sender: UIButton) {
    UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0, options: [], animations: {self.testView.transform = CGAffineTransform(translationX: 0, y: -190)

    }, completion: nil)

所以在这里我只是将容器190向上移动。在容器的底部是一个关闭按钮,未显示(仍在超视图外)。

我很确定问题是我如何在view.frame.maxY + 90(显示90个像素)的第一手位置相对于它的高度。当我减小视图高度时,容器原始位置会越来越向下移动,显然在动画完成后会显示所有内容,但它远远不够。 由于UIKit的原点位于0,0的左上角,我现在已经知道如何将视图定位在超视图的底部,以便显示大约90个像素,并且当动画完成时,所有视图都被移动现在显示在超级视图中。

我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

据我所知,你想要一个只有顶部可见铅按钮的视图。点击按钮后,视图应向上滑动并显示其完整内容。

您只需要操纵内容视图框的Y偏移。

let contentHeight = CGFloat(250) // Full content height
let contentOffset = CGFloat(40) // Offset for the lead button

func displayBottomView(offset: CGFloat) {
    redContentView.frame = CGRect(x: 0, y: view.frame.size.height-offset, width: view.frame.size.width, height: contentHeight)
}

这是配置视图控制器的方法。

override func viewDidLoad() {
    super.viewDidLoad()
    // Set the initial position to show only a button
    displayBottomView(offset: contentOffset) 
}

@IBAction func redButtonDidTap(_ sender: UIButton) {
    UIView.animate(withDuration: 0.5) {
        // Animate displaying of the full content
        self.displayBottomView(offset: self.contentHeight)
    }
}

这个可以工作,但它不是布局操作的好方法。我真的建议你切换到自动布局方法。