Несколько UITextField внутри UIScrollView не кликабельны после определенного количества - PullRequest
0 голосов
/ 27 апреля 2018

Итак, я создал 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:

Image showing view hierarchy

И constrains для contentview:

constrains

И My UITextField доступны для нажатия только до 10-12 текстовых полей в зависимости от размера устройства. Чего мне не хватает?

1 Ответ

0 голосов
/ 27 апреля 2018

Вы перепутали ограничения contentView. Вам нужно только два из них - равная ширина и высота с родителем scrollView.

Также я хотел бы сделать несколько советов: способ создания макета неэффективен, вы должны использовать UITableView или UiCollectionView, потому что вы можете повторно использовать представления / ячейки.

Также вы можете настроить UICollectionViewFlowLayout. Это дает вам много возможностей и поддерживает ваш код в чистоте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...