无法点击UIScrollView中的组件
问题描述:
我试图用编程方式创建一个带有ScrollView的视图,因为我需要一些Storyboard不允许我做的更复杂的处理。无法点击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没有调整到您的滚动视图大小。打印它们,你会看到发生了什么。
在viewDidLayoutSubviews()的大小被设置为W = 320.0和H = 406.0。似乎是正确的。
答
我找到了解决方案。
viewFundo没有设置高度,因此不接受点击组件。 我将viewFundo的大小设置为等于ScrollView.contentSize的大小,并且工作正常。
答
可能你的contentSize没有调整到你的scrollView大小。 打印它们,你会看到发生了什么。
我在控制器中设置contentSize,根据它应该显示的视图的大小。我检查了这一点,并在viewDidLayoutSubviews()后得到** W = 320.0 **和** H = 406.0 ** –
其他想法是,你需要检查..也许你有一些东西在可点击查看顶部.. 。其他我没有想法。 – ovidiur
是的,我也认为必须这样做,但我什么也找不到。 –