gpt4 book ai didi

ios - 无法单击 UIScrollView 内的组件

转载 作者:行者123 更新时间:2023-11-30 12:11:31 25 4
gpt4 key购买 nike

我正在尝试以编程方式使用 ScrollView 创建 View ,因为我需要一些 Storyboard 不允许我做的更复杂的处理。

问题在于 ScrollView 中插入的组件不捕获点击。已经在物理设备和模拟器上进行了测试。

UIScrollView 未全屏。有一个带有固定在底部的按钮的 View 。

注意:我使用 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()
}
}

View 树:

UIView
-UIScrollView
..-UIView
...-UILabel
...-UIView
...
-UIView
..-UIView
..-UILabel
..-UILabel
..-UIButton

和 Controller :

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))


}
<小时/>

我该如何解决这个问题?

@编辑:

Probably you contentSize is not adjusted to your scrollView size. Print them and you will see what is happening.

在 viewDidLayoutSubviews() 中,大小设置为 w = 320.0h = 406.0。看来是正确的。

最佳答案

可能您的 contentSize 未调整为您的 ScrollView 大小。打印它们,您就会看到发生了什么。

关于ios - 无法单击 UIScrollView 内的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45999500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com