我試圖用編程方式創建一個帶有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。似乎是正確的。
我在控制器中設置contentSize,根據它應該顯示的視圖的大小。我檢查了這一點,並在viewDidLayoutSubviews()後得到** W = 320.0 **和** H = 406.0 ** –
其他想法是,你需要檢查..也許你有一些東西在可點擊查看頂部.. 。其他我沒有想法。 – ovidiur
是的,我也認爲必須這樣做,但我什麼也找不到。 –