无法点击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.0H = 406.0。似乎是正确的。

我找到了解决方案。

viewFundo没有设置高度,因此不接受点击组件。 我将viewFundo的大小设置为等于ScrollView.contentSize的大小,并且工作正常。

可能你的contentSize没有调整到你的scrollView大小。 打印它们,你会看到发生了什么。

+0

我在控制器中设置contentSize,根据它应该显示的视图的大小。我检查了这一点,并在viewDidLayoutSubviews()后得到** W = 320.0 **和** H = 406.0 ** –

+0

其他想法是,你需要检查..也许你有一些东西在可点击查看顶部.. 。其他我没有想法。 – ovidiur

+0

是的,我也认为必须这样做,但我什么也找不到。 –