2017-09-01 53 views
0

我試圖用編程方式創建一個帶有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。似乎是正確的。

回答

0

我找到了解決方案。

viewFundo沒有設置高度,因此不接受點擊組件。 我將viewFundo的大小設置爲等於ScrollView.contentSize的大小,並且工作正常。

0

可能你的contentSize沒有調整到你的scrollView大小。 打印它們,你會看到發生了什麼。

+0

我在控制器中設置contentSize,根據它應該顯示的視圖的大小。我檢查了這一點,並在viewDidLayoutSubviews()後得到** W = 320.0 **和** H = 406.0 ** –

+0

其他想法是,你需要檢查..也許你有一些東西在可點擊查看頂部.. 。其他我沒有想法。 – ovidiur

+0

是的,我也認爲必須這樣做,但我什麼也找不到。 –