【问题标题】:Swift - Visual constraints not workingSwift - 视觉约束不起作用
【发布时间】:2016-06-28 01:09:17
【问题描述】:

我有一个滚动视图,我以编程方式对其进行实例化。我想要做的是添加约束,使其在水平和垂直方向上看起来都很好。约束不起作用的问题

垂直方向的外观 - 不错

横向的样子 - 不好

代码如下

class FAPhoto: UIViewController, UIScrollViewDelegate {

var imageURLsArray = [String]()
var imageViews:[UIImageView] = []
var arrayOfPhotos = [Photo]()
var scrollView = UIScrollView()

override func viewDidLoad() {
    super.viewDidLoad()
    scrollView = UIScrollView(frame: self.view.frame)
    view.addSubview(scrollView)
    scrollView.contentSize = CGSizeMake(view.frame.size.width * CGFloat(arrayOfPhotos.count), scrollView.frame.size.height)
    scrollView.pagingEnabled = true
    for (var i = 0; i < arrayOfPhotos.count; i++) {
        var imageView = UIImageView()
        imageView.frame = CGRectMake(CGFloat(i) * view.frame.size.width, scrollView.frame.origin.y, scrollView.frame.size.width, scrollView.frame.size.height)
        imageView.contentMode = .ScaleAspectFit
        let image = imageView.hnk_setImageFromURL(NSURL(string: arrayOfPhotos[i].url!)!)
        scrollView.addSubview(imageView)


    }

}

override func viewWillAppear(animated: Bool) {

}

override func viewWillLayoutSubviews() {
    let bindings = Dictionary(dictionaryLiteral: ("scrollView", self.scrollView))

    let horizontalConstraints =
    NSLayoutConstraint.constraintsWithVisualFormat(
        "H:|-0-[scrollView]-0-|",
        options: [],
        metrics: nil,
        views: bindings)
    self.view.addConstraints(horizontalConstraints)

    let verticalConstraints =
    NSLayoutConstraint.constraintsWithVisualFormat(
        "V:|-0-[scrollView]-0-|",
        options: [],
        metrics: nil,
        views: bindings)
    self.view.addConstraints(verticalConstraints)
}
}

【问题讨论】:

  • 您是否有关于控制台中约束被破坏的警告?由于这是一个滚动视图...您可以在任一方向滚动吗?如果是这样,每个方向都有哪些?

标签: swift autolayout


【解决方案1】:

问题是你在scrollViewviewDidLoad 中设置了contentSize 和imageView 的帧。这对于纵向模式是可以的,但是当视图旋转到横向时,它的框架也会改变,所以你必须相应地更新这些值。我认为您在这里有 3 个机会。

  • 当视图旋转时,跟踪旋转事件并更新 contentSizescrollView 和 imageView 的帧。
  • scrollView 使用自动布局。您不必计算contentSize 或设置imageView 的帧,只需在viewDidLoad 中设置一次约束。在这里你可以找到一些例子https://stackoverflow.com/a/20232911/4757335
  • 使用UICollectionView 而不是UIScrollView。它更容易处理旋转。

【讨论】:

  • 感谢您的回复!我想我会尝试第一个选项。您能建议一下,在创建后如何在 scrollView 中更改 imageView 的框架?
  • 在这种情况下,您必须将对 imageViews 的引用存储在某个数组中,然后设置它们的帧,就像在 viewDidLoad 中设置它们一样。我还更新了答案,强烈建议您尝试第三个选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 2015-01-25
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多