gpt4 book ai didi

ios - 用户打字时覆盖变暗

转载 作者:可可西里 更新时间:2023-11-01 02:18:40 25 4
gpt4 key购买 nike

当用户点击文本字段时,我想使屏幕的其余部分(文本框下方、键盘上方的所有内容)变暗,以明确他们应该做什么。我相信它涉及放下透明的 UI View 并向其添加手势识别器,但我不太确定该怎么做。

当用户到达屏幕时,我有以下代码。这是我要添加新 UI View 的地方吗?

override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
textField.becomeFirstResponder()
}

谢谢!

最佳答案

我创建了 UIView 的子类有两个原因:

  • 你可以给它添加一个手势识别器
  • 你可以给它添加一个委托(delegate)

因为添加到 View 的最后一个 subview 在顶部,所以我首先添加深色层,然后调用 bringSubviewToFront(textview) 这会将深色层放在相关的 textview 和其他所有内容之间。

我创建了一个只有一个功能的协议(protocol)。此函数由手势识别器调用,并将 DarkView 的实例返回给委托(delegate)。委托(delegate)(您的 ViewController)然后可以将其从其 super View 中删除。您可以在没有委托(delegate)函数的情况下执行此操作,但您还必须在文本字段上调用 ​​resignFirstResponder()

不要忘记在您的 ViewController 中设置 DarkView 的委托(delegate)。

只是一个带有一些文本字段的 VC。

class FirstViewController: UIViewController, DarkViewDelegate, UITextFieldDelegate {

var masterView : UIView!

override func viewDidLoad() {

super.viewDidLoad()

masterView = UIView(frame: self.view.frame)
masterView.backgroundColor = UIColor.whiteColor()

let textField1 = UITextField(frame: CGRect(x: 50, y: 20, width: 300, height: 20))
let textField2 = UITextField(frame: CGRect(x: 50, y: 60, width: 300, height: 20))
let textField3 = UITextField(frame: CGRect(x: 50, y: 100, width: 300, height: 20))
let textField4 = UITextField(frame: CGRect(x: 50, y: 140, width: 300, height: 20))

func styleTextField(field : UITextField) {
field.layer.borderColor = UIColor.blackColor().CGColor
field.layer.borderWidth = 2
field.layer.cornerRadius = field.frame.size.height / 2
field.backgroundColor = UIColor.whiteColor()
field.delegate = self
masterView.addSubview(field)
}

styleTextField(textField1)
styleTextField(textField2)
styleTextField(textField3)
styleTextField(textField4)

self.view.addSubview(masterView)
// Do any additional setup after loading the view, typically from a nib.

}

// delegate function of a textfield
func textFieldDidBeginEditing(textField: UITextField) {
focusUserOn(textField) // darken everything else
}

// delegate function of DarkView undarken everything
func tappedDark(view: DarkView) {

guard let superV = view.superview else {
return
}

if let textField = superV.subviews.last as? UITextField {
textField.resignFirstResponder() // also stop editing
}

view.removeFromSuperview()
}

func focusUserOn(textfield: UITextField) {

guard let superV = textfield.superview else {
return
}

let darkArea = DarkView(frame: superV.bounds)
darkArea.delegate = self
superV.addSubview(darkArea)// add DarkView (everything is dark now)

superV.bringSubviewToFront(textfield) // bring the textview back to the front.
}

}

带有手势识别器的 UIView 的简单子(monad)类

class DarkView : UIView, UIGestureRecognizerDelegate {

weak var delegate : DarkViewDelegate?

override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.4)
let tap = UITapGestureRecognizer(target: self, action: Selector("tapped"))
tap.delegate = self
self.addGestureRecognizer(tap)
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

deinit {
print("deinit dark")
}

func tapped() {
guard let del = self.delegate else {
return
}
del.tappedDark(self)
}
}

当 DarkView 被点击到 VC 时传递 DarkView 的协议(protocol)

protocol DarkViewDelegate : class {

func tappedDark(view:DarkView)

}

深思熟虑

func textFieldDidEndEditing(textField: UITextField) {
guard let superV = view.superview else {
return
}

for subview in superV.subviews {

if subview is DarkView {
subview.removeFromSuperview()
}

}
}

关于ios - 用户打字时覆盖变暗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33601372/

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