Si vous appuyez sur le bouton de la barre de la barre d'outils du clavier affiché par UITextField ou UITextView, une autre barre sera affichée.
En tant qu'image, la barre d'outils pour sélectionner l'heure et les paramètres régionaux du rappel, qui est implémentée dans la véritable application de rappel iOS, sera la même.
Je vois souvent la manière de base de définir une barre d'outils sur le clavier avec textView.inputAccessoryView = toolbar
,
Je n'ai pas pu trouver un moyen de changer la hauteur de la barre de manière dynamique, alors j'espère que cela aide.
Lorsque vous appuyez sur le bouton de la cloche dans la barre d'outils, un bouton pour sélectionner l'intervalle de temps de notification apparaîtra un cran plus haut.
Au début, j'ai essayé de changer dynamiquement la hauteur de la barre d'outils définie avec textView.inputAccessoryView = toolbar
, mais je n'ai pas pu le faire correctement. .. ..
(S'il vous plaît laissez-moi savoir si vous savez comment le mettre en œuvre!)
Cette fois, masquez la vue enfant sur la face arrière avec addSubview
et sendSubviewToBack
pour la barre d'outils définie avec textView.inputAccessoryView = toolbar
.
L'affichage est commuté en se déplaçant vers le haut et vers le bas.
Cette fois, j'ai créé un CustomTableViewCell dans l'UITableView et placé l'UITextView sur la cellule. Fait en sorte que le clavier soit visible par UITextView dans CustomTableViewCell pour afficher la barre d'outils sur le clavier.
CustomTableViewCell.swift
let lowerToolbar = LowerToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
lowerToolbar.initToolbarButton(item: item!)
lowerToolbar.delegate = self
textView.inputAccessoryView = lowerToolbar
Voici le contenu de la barre d'outils inférieure définie ci-dessus
LowerToolbar.swift
protocol LowerToolbarDelegete: class {
func onTouchToolbarButton(selectedTimeInterval: Int)
}
class LowerToolbar: UIView {
@IBOutlet weak var toolbar: UIToolbar!
var upperToolbar: UIView?
var isHidenUpperToolbar: Bool = true
var upperToolbarCenterY: CGFloat = 0
weak var delegate: LowerToolbarDelegete! = nil
let oneHourButton = UIButton(type: .system)
let threeHourButton = UIButton(type: .system)
let fiveHourButton = UIButton(type: .system)
var item: ItemModel?
var selectedTimeInterval: Int = 0 // Last tapped button.
override init(frame: CGRect){
super.init(frame: frame)
loadNib()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
loadNib()
}
func loadNib(){
let view = Bundle.main.loadNibNamed("LowerToolbar", owner: self, options: nil)?.first as! UIView
view.frame = self.bounds
self.addSubview(view)
toolbar.clipsToBounds = true
upperToolbar = UIView(frame: CGRect(x: 0, y: -1, width: self.frame.size.width, height: 61))
upperToolbar?.backgroundColor = UIColor.toolbar
self.addSubview(upperToolbar!)
self.sendSubviewToBack(upperToolbar!)
upperToolbarCenterY = upperToolbar!.center.y
}
func createToolbarButton(btn: UIButton, title: String, timeInterval: Int) {
btn.setTitle(title, for: .normal)
btn.tag = timeInterval
btn.layer.borderWidth = 1
btn.layer.borderColor = UIColor.toolbarBorder.cgColor
btn.layer.cornerRadius = 20
btn.contentEdgeInsets = UIEdgeInsets(top: 10, left: 20, bottom: 10, right: 20)
btn.backgroundColor = UIColor.toolbarButton
btn.addTarget(self, action: #selector(tapHoursButton), for: .touchUpInside)
upperToolbar?.addSubview(btn)
if self.item?.timeInterval == timeInterval {
btn.layer.borderColor = UIColor.systemBlue.cgColor
btn.backgroundColor = UIColor.systemBlue
btn.tintColor = UIColor.white
}
}
func initToolbarButton(item: ItemModel) {
self.item = item
createToolbarButton(btn: oneHourButton, title: "1hour", timeInterval: 60)
oneHourButton.translatesAutoresizingMaskIntoConstraints = false
oneHourButton.leadingAnchor.constraint(equalTo: upperToolbar!.leadingAnchor, constant: 20).isActive = true
oneHourButton.topAnchor.constraint(equalTo: upperToolbar!.topAnchor, constant: 10).isActive = true
createToolbarButton(btn: threeHourButton, title: "3hour", timeInterval: 180)
threeHourButton.translatesAutoresizingMaskIntoConstraints = false
threeHourButton.leadingAnchor.constraint(equalTo: oneHourButton.trailingAnchor, constant: 20).isActive = true
threeHourButton.topAnchor.constraint(equalTo: upperToolbar!.topAnchor, constant: 10).isActive = true
createToolbarButton(btn: fiveHourButton, title: "5hour", timeInterval: 400)
fiveHourButton.translatesAutoresizingMaskIntoConstraints = false
fiveHourButton.leadingAnchor.constraint(equalTo: threeHourButton.trailingAnchor, constant: 20).isActive = true
fiveHourButton.topAnchor.constraint(equalTo: upperToolbar!.topAnchor, constant: 10).isActive = true
}
func initUpperToolbar() {
upperToolbar?.center.y = upperToolbarCenterY
isHidenUpperToolbar = true
}
func decorateTappedHourButton(btn: UIButton) {
btn.layer.borderColor = UIColor.systemBlue.cgColor
btn.backgroundColor = UIColor.systemBlue
btn.tintColor = UIColor.white
}
func decorateNormalHourButton(btn: UIButton) {
btn.layer.borderColor = UIColor.toolbarBorder.cgColor
btn.backgroundColor = UIColor.toolbarButton
btn.tintColor = .systemBlue
}
func decorateHourButton(btn1: UIButton, btn2: UIButton, btn3: UIButton, newTimeInterval: Int) {
if selectedTimeInterval == newTimeInterval {
selectedTimeInterval = 0
decorateNormalHourButton(btn: btn1)
} else {
selectedTimeInterval = newTimeInterval
decorateTappedHourButton(btn: btn1)
}
decorateNormalHourButton(btn: btn2)
decorateNormalHourButton(btn: btn3)
}
@objc func tapHoursButton(btn: UIButton) {
switch btn.tag {
case 60:
decorateHourButton(btn1: oneHourButton, btn2: threeHourButton, btn3: fiveHourButton, newTimeInterval: btn.tag)
case 180:
decorateHourButton(btn1: threeHourButton, btn2: oneHourButton, btn3: fiveHourButton, newTimeInterval: btn.tag)
case 400:
decorateHourButton(btn1: fiveHourButton, btn2: oneHourButton, btn3: threeHourButton, newTimeInterval: btn.tag)
default:
print("no item")
}
delegate?.onTouchToolbarButton(selectedTimeInterval: btn.tag)
}
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
if isHidenUpperToolbar {
let rect = self.bounds
return rect.contains(point)
} else {
var rect = self.bounds
if rect.contains(point) {
return rect.contains(point)
}
rect.origin.y -= 60
return rect.contains(point)
}
}
@IBAction func tapBellButton(_ sender: Any) {
if isHidenUpperToolbar {
UIView.animate(withDuration: 0.1, animations: {
self.upperToolbar!.center.y -= 60
self.isHidenUpperToolbar = false
self.layoutIfNeeded()
})
} else {
UIView.animate(withDuration: 0.1, animations: {
self.upperToolbar!.center.y += 60
self.isHidenUpperToolbar = true
self.layoutIfNeeded()
})
}
}
}
LowerToolbar.swift
func loadNib(){
let view = Bundle.main.loadNibNamed("LowerToolbar", owner: self, options: nil)?.first as! UIView
view.frame = self.bounds
self.addSubview(view)
toolbar.clipsToBounds = true
upperToolbar = UIView(frame: CGRect(x: 0, y: -1, width: self.frame.size.width, height: 61))
upperToolbar?.backgroundColor = UIColor.toolbar
self.addSubview(upperToolbar!)
self.sendSubviewToBack(upperToolbar!)
upperToolbarCenterY = upperToolbar!.center.y
}
Lors de l'initialisation de la LowerToolbar, créez une UpperToolbar et cachez-la par addSubview
et sendSubviewToBack
pour la déplacer vers l'arrière.
LowerToolbar.swift
@IBAction func tapBellButton(_ sender: Any) {
if isHidenUpperToolbar {
UIView.animate(withDuration: 0.1, animations: {
self.upperToolbar!.center.y -= 60
self.isHidenUpperToolbar = false
self.layoutIfNeeded()
})
} else {
UIView.animate(withDuration: 0.1, animations: {
self.upperToolbar!.center.y += 60
self.isHidenUpperToolbar = true
self.layoutIfNeeded()
})
}
}
Lorsque vous appuyez sur le bouton en forme de cloche, la barre d'outils supérieure est déplacée vers le haut et vers le bas de 60.
LowerToolbar.swift
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
if isHidenUpperToolbar {
//upperToolbar est masqué
//Lorsque la barre d'outils inférieure est tapée
let rect = self.bounds
return rect.contains(point)
} else {
//Bien que la barre d'outils supérieure soit affichée
//Lorsque upperToolbar est tapé
var rect = self.bounds
if rect.contains(point) {
return rect.contains(point)
}
//Lorsque la barre d'outils inférieure est tapée
rect.origin.y -= 60
return rect.contains(point)
}
}
Le point est cette partie, car si vous déplacez la barre d'outils supérieure jusqu'à 60, elle s'étendra au-delà de la zone de cadre de la barre d'outils inférieure de la vue parent.
Je ne pourrai pas recevoir l'événement du bouton sur la barre d'outils supérieure.
Donc, remplacez override func point (inside point: CGPoint, with event: UIEvent?) -> Bool
J'essaie de recevoir un événement lorsque la barre d'outils supérieure est activée.
Cette fois, j'ai généré une barre d'outils supérieure dans la barre d'outils inférieure et l'ai créée avec du code. C'est alors que j'ai utilisé la barre d'outils upperToolbar créée individuellement dans le storyboard, Cela est dû au fait que l'événement tapé à l'aide du délégué n'a pas pu être délégué à upperToolbar-> lowerToolbar-> CustomTableViewCell. (Je n'ai pas pu définir le délégué upperToolbar dans le lowerToolbar.)
Je pense que ce serait la mise en œuvre la plus simple si la hauteur de la barre d'outils pouvait être modifiée dynamiquement. Je ne pouvais pas changer la hauteur comme je m'y attendais, alors j'ai essayé une méthode différente. Comment l'implémentez-vous dans la véritable application de rappel d'Apple? Je suis curieux. J'espère que cela vous aidera.
Recommended Posts