【发布时间】:2019-06-16 21:12:26
【问题描述】:
我正在尝试创建这个用户界面:
使用此代码:
extension String {
func style(_ attributes: [NSAttributedString.Key: Any]) -> NSAttributedString {
return NSAttributedString(string: self, attributes: attributes)
}
}
class ViewController: UIViewController {
private weak var newContainer: UIView?
private weak var newScrollContainer: UIScrollView?
private weak var newInputContainer: UIStackView?
private func addNewContainer() {
let container = UIView()
container.translatesAutoresizingMaskIntoConstraints = false
newContainer = container
view.addSubview(container)
container.topAnchor.constraint(
equalTo: view.safeAreaLayoutGuide.topAnchor,
constant: 0).isActive = true
container.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10).isActive = true
container.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10).isActive = true
container.heightAnchor.constraint(equalToConstant: 368).isActive = true
}
private func configureNewContainer() {
newContainer?.backgroundColor = UIColor(red: 188/255, green: 188/255, blue: 188/255, alpha: 1)
newContainer?.layer.borderColor = UIColor.black.cgColor
newContainer?.layer.borderWidth = 1
newContainer?.layer.cornerRadius = 6
newContainer?.layer.maskedCorners = [
.layerMaxXMaxYCorner,
.layerMaxXMinYCorner,
.layerMinXMaxYCorner,
.layerMinXMinYCorner]
}
private func addNewScrollContainer() {
guard let container = newContainer else { return }
let scroll = UIScrollView()
scroll.translatesAutoresizingMaskIntoConstraints = false
self.newScrollContainer = scroll
newContainer?.addSubview(scroll)
scroll.topAnchor.constraint(equalTo: container.topAnchor, constant: 75).isActive = true
scroll.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: 28).isActive = true
scroll.trailingAnchor.constraint(
equalTo: container.trailingAnchor,
constant: 18).isActive = true
scroll.bottomAnchor.constraint(equalTo: container.bottomAnchor, constant: 36).isActive = true
}
private func addStack() {
let stack = UIStackView()
stack.translatesAutoresizingMaskIntoConstraints = false
stack.axis = .vertical
stack.spacing = UIStackView.spacingUseSystem
stack.distribution = .fillProportionally
self.newInputContainer = stack
newScrollContainer?.addSubview(stack)
newScrollContainer?.topAnchor.constraint(equalTo: stack.topAnchor, constant: 0).isActive = true
newScrollContainer?.leadingAnchor.constraint(equalTo: stack.leadingAnchor, constant: 0).isActive = true
newScrollContainer?.trailingAnchor.constraint(equalTo: stack.trailingAnchor, constant:0).isActive = true
newScrollContainer?.bottomAnchor.constraint(equalTo: stack.bottomAnchor, constant: 0).isActive = true
}
private func addStackControls() {
guard let container = newInputContainer else { return }
let red: [NSAttributedString.Key: Any] = [.foregroundColor: UIColor.red]
let dest = UITextField()
dest.attributedPlaceholder = "destination".style(red)
let cost = UITextField()
cost.attributedPlaceholder = "cost".style(red)
let pets = UITextField()
pets.attributedPlaceholder = "pets".style(red)
let people = UITextField()
people.attributedPlaceholder = "people".style(red)
let horizDivider = UIView()
horizDivider.backgroundColor = UIColor.black
horizDivider.heightAnchor.constraint(equalToConstant: 1).isActive = true
let width = container.frame.size.width*0.85
horizDivider.widthAnchor.constraint(equalToConstant: width).isActive = true
let origin = UITextField()
origin.attributedPlaceholder = "origin".style(red)
let departure = UITextField()
departure.attributedPlaceholder = "departure".style(red)
let note = UITextField()
note.attributedPlaceholder = "note".style(red)
let help = UIButton()
help.heightAnchor.constraint(equalToConstant: 26).isActive = true
help.widthAnchor.constraint(equalToConstant: 26).isActive = true
help.layer.cornerRadius = 13
help.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMaxXMinYCorner, .layerMinXMaxYCorner, .layerMinXMinYCorner]
help.backgroundColor = UIColor.gray
help.layer.borderColor = UIColor.darkGray.cgColor
help.layer.borderWidth = 1
help.setAttributedTitle("?".style([.foregroundColor: UIColor.white]), for: .normal)
let vertDivider = UIView()
vertDivider.backgroundColor = UIColor.gray
vertDivider.widthAnchor.constraint(equalToConstant: 1).isActive = true
vertDivider.heightAnchor.constraint(equalToConstant: 25).isActive = true
let save = UIButton()
save.heightAnchor.constraint(equalToConstant: 35).isActive = true
save.widthAnchor.constraint(equalToConstant: 91).isActive = true
save.layer.cornerRadius = 6
save.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMaxXMinYCorner, .layerMinXMaxYCorner, .layerMinXMinYCorner]
save.layer.borderWidth = 1
save.layer.borderColor = UIColor.white.cgColor
save.backgroundColor = .clear
let costPetsPeople = UIStackView(arrangedSubviews: [cost, pets, people])
costPetsPeople.spacing = UIStackView.spacingUseSystem
costPetsPeople.distribution = .fillEqually
costPetsPeople.axis = .horizontal
let originDeparture = UIStackView(arrangedSubviews: [origin, departure])
originDeparture.spacing = UIStackView.spacingUseSystem
originDeparture.distribution = .fillEqually
costPetsPeople.axis = .horizontal
let helpDividerSave = UIStackView(arrangedSubviews: [help, vertDivider, save])
helpDividerSave.distribution = .fillProportionally
helpDividerSave.axis = .horizontal
[dest, costPetsPeople, horizDivider, originDeparture, note, helpDividerSave].forEach {
newInputContainer?.addArrangedSubview($0)
}
}
override func viewDidLoad() {
super.viewDidLoad()
addNewContainer()
configureNewContainer()
addNewScrollContainer()
addStack()
addStackControls()
view.backgroundColor = UIColor(red: 206/255, green: 196/255, blue: 163/255, alpha: 1)
}
}
但我明白了:
感谢您的阅读,希望对您有所帮助:)。
【问题讨论】:
-
您有冲突,请阅读它们以解决问题
-
@Sh_Khan - 我只有在将东西添加到堆栈视图时才会有冲突,我认为这应该消除对约束的需求。
标签: ios swift uiscrollview uikit uistackview