【问题标题】:How to fix AutoLayout for my ScrollView?如何为我的 ScrollView 修复 AutoLayout?
【发布时间】:2016-08-31 20:36:54
【问题描述】:

我有一个视图控制器,它有一个 UIView(ParentView),然后是 UIScrollview(ScrollView)。 ParentView 锚定到 ViewController 的前导、尾随、顶部和底部。 ScrollView 锚定到 ParentView 的前导、尾随、顶部和底部。结构是这样的:

-UIView
--ParentView
---ScrollView

然后我创建了一个包含图像和标签的 xib 文件。 xib 将动态添加到 ScrollView。 xib 框架的高度和宽度等于 ScrollView 的高度和宽度。

当我在 iphone 6 上运行模拟器时,滚动效果很好; xib 的宽度正好是屏幕的宽度。但是当我用 iphone 6 运行模拟器时,xib 的宽度与屏幕的大小相同,滚动到下一个项目时会有额外的空间。我该怎么做才能删除它!?

这是 iphone 6 plus 的屏幕截图

这是 iphone 6 的屏幕截图。请注意第二个屏幕的额外空间

这是我的代码:

import UIKit
class ViewController: UIViewController {
@IBOutlet weak var ParentView: UIView!
@IBOutlet weak var ScrollView: UIScrollView!
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    let photos = ["joe", "john"]
    let userNames = ["joe", "john"]
    self.ScrollView.frame = CGRectMake(0, 0, self.ParentView.frame.size.width, self.ParentView.frame.size.height)

    self.ScrollView.contentSize = CGSizeMake(self.ParentView.frame.size.width * CGFloat(photos.count), self.ParentView.frame.size.height)
    self.ScrollView.pagingEnabled = true
    var i: Int = 0
    while i < 2 {
        if let userXib = NSBundle.mainBundle().loadNibNamed("User", owner: self, options: nil)[0] as? User {
            userXib.frame = CGRect(x: self.ScrollView.frame.size.width * CGFloat(i), y: 0, width: self.ScrollView.frame.size.width, height: userXib.frame.size.height)
            userXib.assignValues(photos[i], myName: userNames[i])
            self.ScrollView.addSubview(userXib)
        }
        i = i + 1
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
}

更新 #1 - Coder1000 解决方案: 我尝试通过在滚动中添加 UIView 层来在您的答案中实现#3 & #4。我称它为 ScrollMainView。在情节提要中,我设置了它的前导、尾随、顶部和底部来填充它的超级视图:滚动视图,然后在循环中将这些元素添加到它而不是滚动视图。 但现在滚动不滚动了!我的代码和最终显示如下:

import UIKit
class ViewController: UIViewController {
@IBOutlet weak var ParentView: UIView!
@IBOutlet weak var ScrollView: UIScrollView!
@IBOutlet weak var ScrollMainView: UIView!
override func viewDidLoad() {
    super.viewDidLoad()
    let photos = ["joe", "john"]
    let userNames = ["joe", "john"]
    self.ScrollView.frame = CGRectMake(0, 0, self.ParentView.frame.size.width, self.ParentView.frame.size.height)
    self.ScrollView.contentSize = CGSizeMake(self.ParentView.frame.size.width * CGFloat(photos.count), self.ParentView.frame.size.height)
    self.ScrollView.pagingEnabled = true
    self.ScrollMainView.frame = CGRectMake(0, 0, self.ScrollView.frame.size.width, self.ScrollView.frame.size.height)
    print("the frame for parentview is: \(self.ParentView.frame)")
    var i: Int = 0
    while i < 2 {
        if let userXib = NSBundle.mainBundle().loadNibNamed("User", owner: self, options: nil)[0] as? User {
            userXib.frame = CGRect(x: self.ScrollMainView.frame.size.width * CGFloat(i), y: 0, width: self.ScrollMainView.frame.size.width, height: userXib.frame.size.height)
            userXib.assignValues(photos[i], myName: userNames[i])
            self.ScrollMainView.addSubview(userXib)
        }
        i = i + 1
    }
    self.ScrollView.addSubview(ScrollMainView)
      }
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
}

【问题讨论】:

  • 在滚动视图中获得正确的自动布局给了我很多白发。不幸的是,我使用的是 Xamarin/C# 而不是 Swift。因此,我使用程序化布局和一个名为 Cirrious.Fluentlayout 的优秀包/库解决了我的问题。它一口气解决了我所有的问题,并且非常易于使用。它隐藏了你所有的布局混乱。

标签: swift uiscrollview ios9 xcode7 ios-autolayout


【解决方案1】:

有几种解决方法,viewDidLoad中frame设置不正确,所以一问就错了。

parentView 和你的scrollView 后面会被autolayout 约束调整,但是你的User view 不是...

一个简单的解决方案可能是将代码放入:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    self.ScrollView.frame = CGRectMake(0, 0, self.ParentView.frame.size.width, self.ParentView.frame.size.height)

    self.ScrollView.contentSize = CGSizeMake(self.ParentView.frame.size.width * CGFloat(photos.count), self.ParentView.frame.size.height)
    self.ScrollView.pagingEnabled = true

    for subView: UIView in self.ScrollView.subviews {
        if subView is User { subView.removeFromSuperview()
    }

    var i: Int = 0
    while i < 2 {
        if let userXib = NSBundle.mainBundle().loadNibNamed("User", owner: self, options: nil)[0] as? User {
            userXib.frame = CGRect(x: self.ScrollView.frame.size.width * CGFloat(i), y: 0, width: self.ScrollView.frame.size.width, height: userXib.frame.size.height)
            userXib.assignValues(photos[i], myName: userNames[i])
            self.ScrollView.addSubview(userXib)
        }
        i = i + 1
    }
}    

或者您可以通过编程方式向自定义 xib 添加约束。

或者您可以保留一组您的 costom xib,并在 viewDidLayoutSubviews() 中调整它们的框架和滚动视图内容大小

或者你可以把代码放在viewDidAppear()中

【讨论】:

  • 不需要其他选项。只需将代码放在 viewDidLayoutSubviews 中就可以了!我读了很多例子,但没有人提到过,急!
猜你喜欢
  • 2020-12-19
  • 2020-02-21
  • 2011-07-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
相关资源
最近更新 更多