私は、Storyboardではできない複雑な処理が必要なため、ScrollViewでビューをプログラムで作成しようとしています。UIScrollView内のコンポーネントをクリックできません
ScrollViewに挿入されたコンポーネントは、タップをキャプチャしないという問題があります。既に物理デバイスとエミュレータでテストしています。
UIScrollViewはフルスクリーンではありません。ボタンが下に固定されたビューがあります。
注:私はPureLayoutライブラリで制約を設定しています。 Appleの制約ライブラリに切り替えることができます。
ここ、私のビュー:
import UIKit
import PureLayout
class DetalheProduto: UIView {
var shouldSetupConstraints = true
let screenSize = UIScreen.main.bounds
var scrollView: UIScrollView!
var viewFundo: UIView!
var bannerView: UIImageView!
var viewPreco: UIView!
var preco: UILabel!
var fundo: UIView!
var nomeProduto: UILabel!
var divisor : UIView!
var lblQuantidade: UILabel!
var stepperQuantidade: UIStepperCustom!
var viewAvancar: UIView!
var divisor2: UIView!
var lblTotal: UILabel!
var total: UILabel!
var btnAvancar: UIButton!
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = UIColor.white
scrollView = UIScrollView(frame: .zero)
self.addSubview(scrollView)
viewFundo = UIView(frame: .zero)
self.scrollView.addSubview(viewFundo)
bannerView = UIImageView(frame: .zero)
bannerView.autoSetDimension(.height, toSize: screenSize.width/2)
bannerView.autoSetDimension(.width, toSize: screenSize.width)
bannerView.contentMode = .scaleAspectFit
self.viewFundo.addSubview(bannerView)
viewPreco = UIView(frame: .zero)
viewPreco.backgroundColor = UIColor(codHex: 0x6BC43C)
viewPreco.addShadow(offset: CGSize(width: 1, height: 1), radius: 2.0, color: UIColor.black, opacity: 0.5)
self.viewFundo.addSubview(viewPreco)
preco = UILabel(frame: .zero)
preco.text = "R$ 0,00"
preco.textAlignment = .center
preco.textColor = UIColor.white
preco.font = UIFont.systemFont(ofSize: 16.0)
viewPreco.addSubview(preco)
fundo = UIView(frame: CGRect.zero)
fundo.backgroundColor = UIColor.purple
fundo.autoSetDimension(.width, toSize: screenSize.width)
self.viewFundo.addSubview(fundo)
///
nomeProduto = UILabel(frame: .zero)
nomeProduto.autoSetDimension(.height, toSize: 32.0)
nomeProduto.text = "Nome do Produto"
nomeProduto.textColor = UIColor.orange
nomeProduto.font = UIFont.systemFont(ofSize: 20.0)
self.fundo.addSubview(nomeProduto)
divisor = UIView(frame: .zero)
divisor.autoSetDimension(.height, toSize: 1.0)
divisor.backgroundColor = UIColor.lightGray
self.fundo.addSubview(divisor)
lblQuantidade = UILabel(frame: .zero)
lblQuantidade.autoSetDimension(.height, toSize: 30.0)
lblQuantidade.text = "Quantidade"
lblQuantidade.textColor = UIColor(codHex: 0x707070)
lblQuantidade.font = UIFont.systemFont(ofSize: 16.0)
self.fundo.addSubview(lblQuantidade)
stepperQuantidade = UIStepperCustom(frame: .zero)
stepperQuantidade.autoSetDimension(.height, toSize: 30.0)
stepperQuantidade.autoSetDimension(.width, toSize: 120.0)
stepperQuantidade.borderColorBotaoDireito = UIColor.orange
stepperQuantidade.textColorBotaoDireito = UIColor.orange
stepperQuantidade.valor = 1
stepperQuantidade.valorPasso = 1
stepperQuantidade.valorMinimo = 1
stepperQuantidade.valorMaximo = 100
self.fundo.addSubview(stepperQuantidade)
viewAvancar = UIView(frame: .zero)
viewAvancar.autoSetDimension(.width, toSize: screenSize.width)
viewAvancar.autoSetDimension(.height, toSize: 86.0)
viewAvancar.backgroundColor = UIColor.white
self.addSubview(viewAvancar)
divisor2 = UIView(frame: .zero)
divisor2.autoSetDimension(.height, toSize: 1.0)
divisor2.backgroundColor = UIColor.lightGray
self.viewAvancar.addSubview(divisor2)
lblTotal = UILabel(frame: .zero)
lblTotal.text = "TOTAL:"
lblTotal.textColor = UIColor(codHex: 0x6BC43C)
lblTotal.font = UIFont.systemFont(ofSize: 16.0)
self.viewAvancar.addSubview(lblTotal)
total = UILabel(frame: .zero)
total.text = "R$ 0,00"
total.textAlignment = .right
total.textColor = UIColor(codHex: 0x6BC43C)
total.font = UIFont.systemFont(ofSize: 16.0)
self.viewAvancar.addSubview(total)
btnAvancar = UIButton(frame: .zero)
btnAvancar.autoSetDimension(.height, toSize: 45.0)
btnAvancar.layer.cornerRadius = 2
btnAvancar.backgroundColor = UIColor.orange
btnAvancar.setTitle("ADICIONAR AO CARRINHO", for: .normal)
self.viewAvancar.addSubview(btnAvancar)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func updateConstraints() {
if(shouldSetupConstraints) {
let zero: CGFloat = 0.0
let margem: CGFloat = 8.0
let margem2x: CGFloat = 16.0
scrollView.autoPinEdgesToSuperviewEdges(with: .zero, excludingEdge: .bottom)
scrollView.autoPinEdge(.bottom, to: .top, of: viewAvancar, withOffset: zero)
viewFundo.autoPinEdgesToSuperviewEdges()
bannerView.autoPinEdge(toSuperviewEdge: .top)
viewPreco.autoPinEdge(toSuperviewMargin: .right)
viewPreco.autoPinEdge(toSuperviewMargin: .top)
preco.autoPinEdgesToSuperviewMargins()
fundo.autoPinEdge(toSuperviewEdge: .left)
fundo.autoPinEdge(toSuperviewEdge: .right)
fundo.autoPinEdge(.top, to: .bottom, of: bannerView, withOffset: zero)
nomeProduto.autoPinEdgesToSuperviewEdges(with: UIEdgeInsets(inset: margem), excludingEdge: .bottom)
divisor.autoPinEdge(toSuperviewMargin: .left)
divisor.autoPinEdge(toSuperviewMargin: .right)
divisor.autoPinEdge(.top, to: .bottom, of: nomeProduto, withOffset: margem)
if (lblQuantidade != nil && lblQuantidade.superview != nil) {
lblQuantidade.autoPinEdge(toSuperviewMargin: .left)
lblQuantidade.autoPinEdge(.right, to: .left, of: stepperQuantidade, withOffset: margem)
lblQuantidade.autoPinEdge(.top, to: .bottom, of: divisor, withOffset: margem2x)
}
stepperQuantidade.autoPinEdge(toSuperviewMargin: .right)
stepperQuantidade.autoPinEdge(.top, to: .bottom, of: divisor, withOffset: margem2x)
viewAvancar.autoPinEdgesToSuperviewEdges(with: UIEdgeInsets.zero, excludingEdge: .top)
divisor2.autoPinEdge(toSuperviewEdge: .left)
divisor2.autoPinEdge(toSuperviewEdge: .right)
divisor2.autoPinEdge(toSuperviewEdge: .top)
lblTotal.autoPinEdge(.top, to: .bottom, of: divisor2, withOffset: margem)
lblTotal.autoPinEdge(toSuperviewMargin: .left)
total.autoPinEdge(.top, to: .bottom, of: divisor2, withOffset: margem)
total.autoPinEdge(.left, to: .right, of: lblTotal, withOffset: margem)
total.autoPinEdge(toSuperviewMargin: .right)
btnAvancar.autoPinEdges(toSuperviewMarginsExcludingEdge: .top)
btnAvancar.autoPinEdge(.top, to: .bottom, of: total, withOffset: margem)
btnAvancar.autoPinEdge(.top, to: .bottom, of: lblTotal, withOffset: margem)
//
shouldSetupConstraints = false
}
super.updateConstraints()
}
}
ViewTree:
UIView
-UIScrollView
..-UIView
...-UILabel
...-UIView
...
-UIView
..-UIView
..-UILabel
..-UILabel
..-UIButton
とコントローラ:
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Detalhes"
self.view.addSubview(det)
det.autoPinEdgesToSuperviewEdges(with: UIEdgeInsets.zero)
det.nomeProduto.text = produto.nome
Utilities.smartLoadImage(path: produto.getSrcImagem(), img: det.bannerView)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
var sizeOfContent: CGFloat = 0
for i in 0..<det.fundo.subviews.count {
sizeOfContent += det.fundo.subviews[i].bounds.height
}
det.scrollView.contentSize = CGSize(width: det.screenSize.width, height: (sizeOfContent + det.bannerView.bounds.height))
}
どのように私はこの問題を解決することができますか?
@EDIT:
おそらくcontentSizeはあなたのscrollViewサイズに調整されていません。それらを印刷すると、何が起きているのかがわかります。 viewDidLayoutSubviewsで
()サイズは= 320.0とH = 406.0 wはに設定されています。正しいと思われる。
表示する必要があるビューのサイズに応じて、コントローラにcontentSizeを設定します。私はこれをチェックし、viewDidLayoutSubviews()の後に** w = 320.0 **と** h = 406.0 **を取得します。 –
他のアイデアは、タップ可能なビューの上に何かがあるかをチェックする必要があるということです。私はアイデアを持っていません。 – ovidiur
ええ、私もそれはそれでなければならないと思うが、私は何も識別できなかった。 –