Итак, я создал VerticalView
, который обрабатывает добавление нескольких представлений внутри scrollview
, Он также обрабатывает scrollview
размер содержимого. Это определено так:
import UIKit
class VerticalLayout: UIView {
var yOffsets: [CGFloat] = []
var heightValue : CGFloat = 0.0
init(width: CGFloat) {
super.init(frame: CGRect(x:0, y:0, width:width, height:0))
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
var height: CGFloat = 0
for i in 0..<subviews.count {
let view = subviews[i] as UIView
view.layoutSubviews()
height += yOffsets[i]
view.frame.origin.y = height
height += view.frame.height
}
self.frame.size.height = height
self.heightValue = height
self.frame.size.height = height
self.heightValue = height
let ff = self.superview
let dd = ff?.superview as! UIScrollView
dd.contentSize = CGSize.init(width: self.frame.size.width, height: height)
}
override func addSubview(_ view: UIView) {
yOffsets.append(view.frame.origin.y)
super.addSubview(view)
}
func removeAll() {
for view in subviews {
view.removeFromSuperview()
}
yOffsets.removeAll(keepingCapacity: false)
}
}
А мой View Controller
выглядит так:
import UIKit
import os.log
class ViewController: UIViewController {
@IBOutlet var contentview: UIView!
@IBOutlet var scrollview: UIScrollView!
let colors = [UIColor.red,UIColor.green,UIColor.blue,UIColor.magenta,UIColor.yellow]
override func viewDidLoad() {
super.viewDidLoad()
contentview.backgroundColor = UIColor.lightGray
let vLayout = VerticalLayout(width: view.frame.width)
vLayout.backgroundColor = UIColor.cyan
contentview.addSubview(vLayout)
for i in 0..<14
{
vLayout.addSubview(getView(vLayout.frame.width,color: colors[i % colors.count]))
}
}
func getView(_ width: CGFloat,color:UIColor) -> UIView
{
let view = UITextField(frame: CGRect(x:0, y:0, width:width, height:100))
view.backgroundColor = color
view.placeholder = "Write here"
return view
}
}
Это представление viewcontroller:
И constrains
для contentview
:
И My UITextField
доступны для нажатия только до 10-12 текстовых полей в зависимости от размера устройства. Чего мне не хватает?