如何为我的 ScrollView 修复 AutoLayout?
How to fix AutoLayout for my ScrollView?
我有一个视图控制器,它有一个 UIView(ParentView),然后是 UIScrollview(ScrollView)。 ParentView 锚定到 ViewController 的前导、尾随、顶部和底部。 ScrollView 锚定到 ParentView 的前导、尾随、顶部和底部。结构是这样的:
-UIView
--ParentView
---ScrollView
然后我创建了一个包含图像和标签的 xib 文件。 xib 将动态添加到 ScrollView。 xib 框架的高度和宽度等于 ScrollView 的高度和宽度。
当我 运行 iphone 6 上的模拟器加上卷轴完美运行时; xib 的宽度正好是屏幕的宽度。但是当我运行模拟器用iphone6的时候,xib的宽度和屏幕一样大,滚动到下一项的时候多了一个space。我应该怎么做才能删除它!?
这是 iphone 6 plus
的屏幕截图
这是 iphone 6 的屏幕截图。注意第二个屏幕的额外 space
这是我的代码:
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()
}
}
有几种解决方法,在viewDidLoad中frame没有设置正确,所以一问就错了。
后面的parentView和你的scrollView是通过autolayout约束调整的,但是你的Userview不是...
一个简单的解决方案可能是将代码放入:
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 xibs 数组,然后在 viewDidLayoutSubviews()
中调整它们的框架和 SCROLLVIEW 内容大小
或者你可以把代码放在viewDidAppear()
我有一个视图控制器,它有一个 UIView(ParentView),然后是 UIScrollview(ScrollView)。 ParentView 锚定到 ViewController 的前导、尾随、顶部和底部。 ScrollView 锚定到 ParentView 的前导、尾随、顶部和底部。结构是这样的:
-UIView
--ParentView
---ScrollView
然后我创建了一个包含图像和标签的 xib 文件。 xib 将动态添加到 ScrollView。 xib 框架的高度和宽度等于 ScrollView 的高度和宽度。
当我 运行 iphone 6 上的模拟器加上卷轴完美运行时; xib 的宽度正好是屏幕的宽度。但是当我运行模拟器用iphone6的时候,xib的宽度和屏幕一样大,滚动到下一项的时候多了一个space。我应该怎么做才能删除它!?
这是 iphone 6 plus
的屏幕截图这是 iphone 6 的屏幕截图。注意第二个屏幕的额外 space
这是我的代码:
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()
}
}
有几种解决方法,在viewDidLoad中frame没有设置正确,所以一问就错了。
后面的parentView和你的scrollView是通过autolayout约束调整的,但是你的Userview不是...
一个简单的解决方案可能是将代码放入:
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 xibs 数组,然后在 viewDidLayoutSubviews()
中调整它们的框架和 SCROLLVIEW 内容大小或者你可以把代码放在viewDidAppear()