2017-09-01 10 views
0

私は、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はに設定されています。正しいと思われる。

答えて

0

解決策が見つかりました。

viewFundoは高さが設定されていないため、コンポーネントのクリックを受け付けませんでした。 viewFundoのサイズをScrollView.contentSizeのサイズと等しく設定しました。

0

おそらくcontentSizeはscrollViewのサイズに調整されていません。 それらを印刷すると、何が起きているのかがわかります。

+0

表示する必要があるビューのサイズに応じて、コントローラにcontentSizeを設定します。私はこれをチェックし、viewDidLayoutSubviews()の後に** w = 320.0 **と** h = 406.0 **を取得します。 –

+0

他のアイデアは、タップ可能なビューの上に何かがあるかをチェックする必要があるということです。私はアイデアを持っていません。 – ovidiur

+0

ええ、私もそれはそれでなければならないと思うが、私は何も識別できなかった。 –

関連する問題