【问题标题】:UIScrollView does not fit with constraintsUIScrollView 不符合约束
【发布时间】:2017-08-13 05:40:59
【问题描述】:

我想在键盘出现时使用 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))
    }

}

【问题讨论】:

  • 你必须设置scrollview的contentSize和UIImageView一样,scrollview的frame size和UIScreen一样。
  • 你介意用 UITableview 代替 UIScrollview 吗?放置 UITableView 后,当键盘自动出现时,视图会向上滚动。在这种情况下,您不必处理上述所有情况。
  • UITableView 对于这个简单的用法似乎很难,不是吗?波兰人,我试过了,但还是不行:(
  • 我认为 UITableView 不做键盘处理 - UITableViewController 做 - 所以你需要从中派生你的 VC。
  • 当然可以,但是有没有其他办法可以在出现键盘时让内容上移?

标签: ios swift xcode uiscrollview swift3


【解决方案1】:
  1. 您应该首先在 viewDidLoad 中调用 super。
  2. 您应该阅读滚动视图的工作原理。

这是您需要的: ScrollView 需要左/右/上/下的约束。 这将确定滚动视图可呈现部分的大小。这是您在键盘显示时调整大小的部分。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这绝对是一个不错的方法:)(如果需要,请注意景观)
    猜你喜欢
    • 2014-11-25
    • 2019-03-28
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多