UIScrollView不适合约束

时间:2017-03-21 13:51:53

标签: ios swift xcode uiscrollview swift3

我想使用scrollView在键盘出现时向上移动嵌套视图内容。 (也许你知道一个更好的解决方案?)

因此,我将UIScrollView放入我的UIViewController,将UIImageView放入我的UIScrollView。问题是我的UIScrollView与我的图像大小一样大,尽管有限制。

我提出了以下限制条件:

scrollView.addConstraintsWithFormat(format: "H:|[v0]|", views: backgroundImage)
scrollView.addConstraintsWithFormat(format: "V:|[v0]|", views: backgroundImage)

self.view.addConstraintsWithFormat(format: "H:|[v0]|", views: scrollView)
self.view.addConstraintsWithFormat(format: "V:|[v0]|", views: scrollView) 

有人有解决方案吗?

这是我的完整UIViewController代码:

import UIKit

class HomeViewController: UIViewController {

    let scrollView: UIScrollView = {
        let screenSize = UIScreen.main.bounds
        let scrollView = UIScrollView()
        scrollView.backgroundColor = .red
        scrollView.contentSize = CGSize(width: screenSize.width, height: screenSize.height)
        return scrollView
    }()

    let backgroundImage:  UIImageView = {
        let imageView = UIImageView()
        imageView.image = UIImage(named: "BACKGROUND_ASIA")
        imageView.alpha = 0.5
        return imageView
    }()

    override func viewDidLoad() {
        setupHomeView()
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func setupHomeView() {
        self.view.backgroundColor = UIColor.black

        self.view.addSubview(scrollView)
        self.view.addConstraintsWithFormat(format: "H:|[v0]|", views: scrollView)
        self.view.addConstraintsWithFormat(format: "V:|[v0]|", views: scrollView)

        scrollView.addSubview(backgroundImage)
        scrollView.addConstraintsWithFormat(format: "H:|[v0]|", views: backgroundImage)
        scrollView.addConstraintsWithFormat(format: "V:|[v0]|", views: backgroundImage)
        }
}

extension UIView {

    func addConstraintsWithFormat(format: String, views: UIView...) {
        var viewsDictionary = [String: UIView]()
        for (index, view) in views.enumerated() {
            let key = "v\(index)"
            viewsDictionary[key] = view
            view.translatesAutoresizingMaskIntoConstraints = false
        }

        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: format, options: NSLayoutFormatOptions(), metrics: nil, views: viewsDictionary))
    }

}

2 个答案:

答案 0 :(得分:1)

  1. 你应该在viewDidLoad中首先调用super。
  2. 您应该了解scrollViews的工作原理。
  3. 这是您需要的: ScrollView需要左/右/上/下的约束。 这将确定滚动视图的可呈现部分的大小。这是键盘显示时要调整大小的部分。

    然后,您需要设置ScrollView内容的大小。这是可以滚动的内容。您需要手动设置imageView的大小,或者在imageView和 滚动视图之外的视图之间设置相等。 (例如imageView.width == view.width)。

    希望这指向正确的方向。您可能需要考虑使用Interface Builder进行设置,以便您可以查看所有约束,并在未正确设置时收到警告。

答案 1 :(得分:0)

感谢您的回答PEEJWEEJ,但我找到了另一个替代我的问题。我使用NotificationCenter来通知键盘打开,我创建了一个view.animate()来滚动我的视图。通过这种方式,我避免使用scrollView或tableView。