如何向 .DecimalPad iOS 键盘添加减号?
How to add a minus sign to the .DecimalPad iOS keyboard?
我怎样才能像下面 link 中的应用程序一样向 .DecimalPad 类型 iOS 键盘添加减号?如果我错了请纠正我,但这对我来说不像是自定义键盘,它看起来像是 Apple 给我的默认十进制小键盘...
要向键盘添加一些键,请打开 KeyboardViewController.swift 并进行以下更改。
在 viewDidLoad() 中,在下一个键盘按钮代码之后的函数底部添加以下内容。
let buttonTitles = ["-"]
var buttons = createButtons(buttonTitles)
var topRow = UIView(frame: CGRectMake(0, 0, 320, 40))
for button in buttons {
topRow.addSubview(button)
}
self.view.addSubview(topRow)
addConstraints(buttons, containingView: topRow)
接下来添加下面的函数,该函数将创建带有传递给它的字符串标题的按钮。
func createButtons(titles: [String]) -> [UIButton] {
var buttons = [UIButton]()
for title in titles {
let button = UIButton.buttonWithType(.System) as UIButton
button.setTitle(title, forState: .Normal)
button.setTranslatesAutoresizingMaskIntoConstraints(false)
button.backgroundColor = UIColor(white: 1.0, alpha: 1.0)
button.setTitleColor(UIColor.darkGrayColor(), forState: .Normal)
button.addTarget(self, action: "keyPressed:", forControlEvents: .TouchUpInside)
buttons.append(button)
}
return buttons
}
此函数遍历字符串数组并创建具有相应标题的按钮。它还为每个按钮添加了一个目标,这样当它被点击时,函数 keyPressed() 将被调用。接下来添加这个功能。
func keyPressed(sender: AnyObject?) {
let button = sender as UIButton
let title = button.titleForState(.Normal)
(textDocumentProxy as UIKeyInput).insertText(title!)
}
在这里您可以获取点击按钮的标题,并通过 textDocumentProperty 将其插入到当前文本输入 object 的插入点。这是一个符合 UITextDocumentProxy 协议的 object,充当键盘和调用它的文本输入 object 之间的代理。
接下来我们添加 addConstraints() 方法,它将向按钮和 containingView 添加约束。
func addConstraints(buttons: [UIButton], containingView: UIView){
for (index, button) in enumerate(buttons) {
var topConstraint = NSLayoutConstraint(item: button, attribute: .Top, relatedBy: .Equal, toItem: containingView, attribute: .Top, multiplier: 1.0, constant: 1)
var bottomConstraint = NSLayoutConstraint(item: button, attribute: .Bottom, relatedBy: .Equal, toItem: containingView, attribute: .Bottom, multiplier: 1.0, constant: -1)
var leftConstraint : NSLayoutConstraint!
if index == 0 {
leftConstraint = NSLayoutConstraint(item: button, attribute: .Left, relatedBy: .Equal, toItem: containingView, attribute: .Left, multiplier: 1.0, constant: 1)
}else{
leftConstraint = NSLayoutConstraint(item: button, attribute: .Left, relatedBy: .Equal, toItem: buttons[index-1], attribute: .Right, multiplier: 1.0, constant: 1)
var widthConstraint = NSLayoutConstraint(item: buttons[0], attribute: .Width, relatedBy: .Equal, toItem: button, attribute: .Width, multiplier: 1.0, constant: 0)
containingView.addConstraint(widthConstraint)
}
var rightConstraint : NSLayoutConstraint!
if index == buttons.count - 1 {
rightConstraint = NSLayoutConstraint(item: button, attribute: .Right, relatedBy: .Equal, toItem: containingView, attribute: .Right, multiplier: 1.0, constant: -1)
}else{
rightConstraint = NSLayoutConstraint(item: button, attribute: .Right, relatedBy: .Equal, toItem: buttons[index+1], attribute: .Left, multiplier: 1.0, constant: -1)
}
containingView.addConstraints([topConstraint, bottomConstraint, rightConstraint, leftConstraint])
}
}
运行 应用程序,您应该会看到类似如下所示的键盘
如您所见,以编程方式添加视图需要您在代码中设置约束,如果您的键盘 UI 很复杂并且有很多键,这会变得复杂且难以调试。接下来我们将看看使用 Interface Builder 创建按钮。
通过导航到文件 > 新建 > 文件 > iOS > 用户界面 > 查看来创建 nib 文件。将其命名为 KeyboardView 并确保它位于 AC 键盘目标下。
Select 笔尖的视图,在属性检查器中,将其大小设置为自由形式,将状态栏设置为 None。然后转到 Size Inspector 并将其宽度设置为 320,将高度设置为 220。
In KeyboardViewController.swift 在调用 super.viewDidLoad() 后的 viewDidLoad() 中添加以下内容。这会将 nib 文件设置为视图控制器的视图。
let nib = UINib(nibName: "KeyboardView", bundle: nil)
let objects = nib.instantiateWithOwner(self, options: nil)
view = objects[0] as UIView;
在 nib 的主视图中添加一个视图。单击 Interface Builder 界面底部的 Pin 菜单并为其指定以下约束 – 高度为 40,尾部 space 为 0,前导 space 为 0,顶部 space 到容器共 42 个。确保未选中约束到边距。
add_constraints
向视图添加一个按钮。将文本颜色设置为深灰色并更改标题。现在是限制条件。
对于每个按钮,select 对齐菜单和 select 容器中的垂直居中。
alignment auto layout
Select '-' 按钮并向 Superview 添加前导 space 5。
Select '-' 并在 Size Inspector 中,确保其 Leading Space to S 即设置为常量 5。
Select 主视图,然后是编辑器 > 解决自动布局问题 > 所有视图 > 更新框架。
运行 应用程序,您应该会看到刚刚添加的键设置在您在代码中添加的键下方。
interface_builder_ui
要为键创建出口和操作,select 文档大纲中的文件所有者,然后在身份检查器中,将 class 设置为 KeyboardViewController。然后,您可以通过 Control-dragging 从控件到视图控制器 class,像通常在情节提要文件中一样创建动作和出口。 (您将在下面的示例中看到更多内容)。
现在我们已经了解了如何以编程方式和使用 nib 文件创建键盘的 UI,让我们向它添加一些功能。为此,我有一个我们将要使用的入门项目。该项目是一个简单的键盘,我们将向其添加一些功能。它如下所示。你应该注意,为了简单起见,我没有为所有尺寸 classes 设计,所以虽然它在 iPhone 5S 上看起来不错,但在更大的屏幕上看起来不太一样。您可以在此处下载代码。另请注意,键盘的名称是 Appcoda Keyboard,而不是我们之前使用的 AC Keyboard。
keyboard_starter
我已经设置了我们需要的操作和插座,但还没有为它们编写代码(除了 Next Keyboard 键)。
首先,您会注意到 Next Keyboard 键已替换为名为 KB 的键。这个动作方法可以在视图控制器文件中看到,如下所示。
@IBAction func nextKeyboardPressed(button: UIButton) {
advanceToNextInputMode()
}
我们首先要为带有字母和符号的键设置操作,即您点击的任何键都会将其标题视为键入的文本。我为所有这些键创建了一个名为 keyPressed() 的操作方法。如图所示修改此方法。
@IBAction func keyPressed(button: UIButton) {
var string = button.titleLabel!.text
(textDocumentProxy as UIKeyInput).insertText("\(string!)")
}
这与我们之前的情况类似。按钮的标题通过 textDocumentProperty 插入到当前文本输入 object 的插入点。我们输入的所有字母都将大写,但我们会尽快解决这个问题。接下来修改以下函数,分别设置backspace(BS)、space(SPACE)和return(RTN)键的动作。
@IBAction func backSpacePressed(button: UIButton) {
(textDocumentProxy as UIKeyInput).deleteBackward()
}
@IBAction func spacePressed(button: UIButton) {
(textDocumentProxy as UIKeyInput).insertText(" ")
}
@IBAction func returnPressed(button: UIButton) {
(textDocumentProxy as UIKeyInput).insertText("\n")
}
运行 应用程序并测试按键。
在视图文件中,您会注意到两个标记为 Char Set 1 和 C 的视图ar 第 2 组。它们位于同一行,一个在另一个之上。在 viewDidLoad() 中,第二个视图被隐藏。如图所示修改 charSetPressed() 函数,以便当用户按下标有 1/2 的键时,键的文本将更改为 2/2 并且一组新字符将出现在键盘的第一行。
@IBAction func charSetPressed(button: UIButton) {
if button.titleLabel!.text == "1/2" {
charSet1.hidden = true
charSet2.hidden = false
button.setTitle("2/2", forState: .Normal)
} else if button.titleLabel!.text == "2/2" {
charSet1.hidden = false
charSet2.hidden = true
button.setTitle("1/2", forState: .Normal)
}
}
字符集
如果您查看系统键盘,通常会在您点击某个键时以简短动画的形式显示一个指示。我们应该添加某种反馈,以便用户知道他们点击了正确的键。在 keyPressed() 方法的末尾添加以下内容。
UIView.animateWithDuration(0.2, animations: {
button.transform = CGAffineTransformScale(CGAffineTransformIdentity, 2.0, 2.0)
}, completion: {(_) -> Void in
button.transform =
CGAffineTransformScale(CGAffineTransformIdentity, 1, 1)
})
这会在恢复原始大小之前轻按按键时短暂放大。
最后我们将实现 Capslock 键 (CL)。修改capsLockPressed()函数如下。
@IBAction func capsLockPressed(button: UIButton) {
capsLockOn = !capsLockOn
changeCaps(row1)
changeCaps(row2)
changeCaps(row3)
changeCaps(row4)
}
我怎样才能像下面 link 中的应用程序一样向 .DecimalPad 类型 iOS 键盘添加减号?如果我错了请纠正我,但这对我来说不像是自定义键盘,它看起来像是 Apple 给我的默认十进制小键盘...
要向键盘添加一些键,请打开 KeyboardViewController.swift 并进行以下更改。
在 viewDidLoad() 中,在下一个键盘按钮代码之后的函数底部添加以下内容。
let buttonTitles = ["-"]
var buttons = createButtons(buttonTitles)
var topRow = UIView(frame: CGRectMake(0, 0, 320, 40))
for button in buttons {
topRow.addSubview(button)
}
self.view.addSubview(topRow)
addConstraints(buttons, containingView: topRow)
接下来添加下面的函数,该函数将创建带有传递给它的字符串标题的按钮。
func createButtons(titles: [String]) -> [UIButton] {
var buttons = [UIButton]()
for title in titles {
let button = UIButton.buttonWithType(.System) as UIButton
button.setTitle(title, forState: .Normal)
button.setTranslatesAutoresizingMaskIntoConstraints(false)
button.backgroundColor = UIColor(white: 1.0, alpha: 1.0)
button.setTitleColor(UIColor.darkGrayColor(), forState: .Normal)
button.addTarget(self, action: "keyPressed:", forControlEvents: .TouchUpInside)
buttons.append(button)
}
return buttons
}
此函数遍历字符串数组并创建具有相应标题的按钮。它还为每个按钮添加了一个目标,这样当它被点击时,函数 keyPressed() 将被调用。接下来添加这个功能。
func keyPressed(sender: AnyObject?) {
let button = sender as UIButton
let title = button.titleForState(.Normal)
(textDocumentProxy as UIKeyInput).insertText(title!)
}
在这里您可以获取点击按钮的标题,并通过 textDocumentProperty 将其插入到当前文本输入 object 的插入点。这是一个符合 UITextDocumentProxy 协议的 object,充当键盘和调用它的文本输入 object 之间的代理。
接下来我们添加 addConstraints() 方法,它将向按钮和 containingView 添加约束。
func addConstraints(buttons: [UIButton], containingView: UIView){
for (index, button) in enumerate(buttons) {
var topConstraint = NSLayoutConstraint(item: button, attribute: .Top, relatedBy: .Equal, toItem: containingView, attribute: .Top, multiplier: 1.0, constant: 1)
var bottomConstraint = NSLayoutConstraint(item: button, attribute: .Bottom, relatedBy: .Equal, toItem: containingView, attribute: .Bottom, multiplier: 1.0, constant: -1)
var leftConstraint : NSLayoutConstraint!
if index == 0 {
leftConstraint = NSLayoutConstraint(item: button, attribute: .Left, relatedBy: .Equal, toItem: containingView, attribute: .Left, multiplier: 1.0, constant: 1)
}else{
leftConstraint = NSLayoutConstraint(item: button, attribute: .Left, relatedBy: .Equal, toItem: buttons[index-1], attribute: .Right, multiplier: 1.0, constant: 1)
var widthConstraint = NSLayoutConstraint(item: buttons[0], attribute: .Width, relatedBy: .Equal, toItem: button, attribute: .Width, multiplier: 1.0, constant: 0)
containingView.addConstraint(widthConstraint)
}
var rightConstraint : NSLayoutConstraint!
if index == buttons.count - 1 {
rightConstraint = NSLayoutConstraint(item: button, attribute: .Right, relatedBy: .Equal, toItem: containingView, attribute: .Right, multiplier: 1.0, constant: -1)
}else{
rightConstraint = NSLayoutConstraint(item: button, attribute: .Right, relatedBy: .Equal, toItem: buttons[index+1], attribute: .Left, multiplier: 1.0, constant: -1)
}
containingView.addConstraints([topConstraint, bottomConstraint, rightConstraint, leftConstraint])
}
}
运行 应用程序,您应该会看到类似如下所示的键盘
如您所见,以编程方式添加视图需要您在代码中设置约束,如果您的键盘 UI 很复杂并且有很多键,这会变得复杂且难以调试。接下来我们将看看使用 Interface Builder 创建按钮。
通过导航到文件 > 新建 > 文件 > iOS > 用户界面 > 查看来创建 nib 文件。将其命名为 KeyboardView 并确保它位于 AC 键盘目标下。
Select 笔尖的视图,在属性检查器中,将其大小设置为自由形式,将状态栏设置为 None。然后转到 Size Inspector 并将其宽度设置为 320,将高度设置为 220。
In KeyboardViewController.swift 在调用 super.viewDidLoad() 后的 viewDidLoad() 中添加以下内容。这会将 nib 文件设置为视图控制器的视图。
let nib = UINib(nibName: "KeyboardView", bundle: nil)
let objects = nib.instantiateWithOwner(self, options: nil)
view = objects[0] as UIView;
在 nib 的主视图中添加一个视图。单击 Interface Builder 界面底部的 Pin 菜单并为其指定以下约束 – 高度为 40,尾部 space 为 0,前导 space 为 0,顶部 space 到容器共 42 个。确保未选中约束到边距。
add_constraints
向视图添加一个按钮。将文本颜色设置为深灰色并更改标题。现在是限制条件。
对于每个按钮,select 对齐菜单和 select 容器中的垂直居中。
alignment auto layout
Select '-' 按钮并向 Superview 添加前导 space 5。
Select '-' 并在 Size Inspector 中,确保其 Leading Space to S 即设置为常量 5。
Select 主视图,然后是编辑器 > 解决自动布局问题 > 所有视图 > 更新框架。
运行 应用程序,您应该会看到刚刚添加的键设置在您在代码中添加的键下方。
interface_builder_ui
要为键创建出口和操作,select 文档大纲中的文件所有者,然后在身份检查器中,将 class 设置为 KeyboardViewController。然后,您可以通过 Control-dragging 从控件到视图控制器 class,像通常在情节提要文件中一样创建动作和出口。 (您将在下面的示例中看到更多内容)。
现在我们已经了解了如何以编程方式和使用 nib 文件创建键盘的 UI,让我们向它添加一些功能。为此,我有一个我们将要使用的入门项目。该项目是一个简单的键盘,我们将向其添加一些功能。它如下所示。你应该注意,为了简单起见,我没有为所有尺寸 classes 设计,所以虽然它在 iPhone 5S 上看起来不错,但在更大的屏幕上看起来不太一样。您可以在此处下载代码。另请注意,键盘的名称是 Appcoda Keyboard,而不是我们之前使用的 AC Keyboard。
keyboard_starter
我已经设置了我们需要的操作和插座,但还没有为它们编写代码(除了 Next Keyboard 键)。
首先,您会注意到 Next Keyboard 键已替换为名为 KB 的键。这个动作方法可以在视图控制器文件中看到,如下所示。
@IBAction func nextKeyboardPressed(button: UIButton) {
advanceToNextInputMode()
}
我们首先要为带有字母和符号的键设置操作,即您点击的任何键都会将其标题视为键入的文本。我为所有这些键创建了一个名为 keyPressed() 的操作方法。如图所示修改此方法。
@IBAction func keyPressed(button: UIButton) {
var string = button.titleLabel!.text
(textDocumentProxy as UIKeyInput).insertText("\(string!)")
}
这与我们之前的情况类似。按钮的标题通过 textDocumentProperty 插入到当前文本输入 object 的插入点。我们输入的所有字母都将大写,但我们会尽快解决这个问题。接下来修改以下函数,分别设置backspace(BS)、space(SPACE)和return(RTN)键的动作。
@IBAction func backSpacePressed(button: UIButton) {
(textDocumentProxy as UIKeyInput).deleteBackward()
}
@IBAction func spacePressed(button: UIButton) {
(textDocumentProxy as UIKeyInput).insertText(" ")
}
@IBAction func returnPressed(button: UIButton) {
(textDocumentProxy as UIKeyInput).insertText("\n")
}
运行 应用程序并测试按键。
在视图文件中,您会注意到两个标记为 Char Set 1 和 C 的视图ar 第 2 组。它们位于同一行,一个在另一个之上。在 viewDidLoad() 中,第二个视图被隐藏。如图所示修改 charSetPressed() 函数,以便当用户按下标有 1/2 的键时,键的文本将更改为 2/2 并且一组新字符将出现在键盘的第一行。
@IBAction func charSetPressed(button: UIButton) {
if button.titleLabel!.text == "1/2" {
charSet1.hidden = true
charSet2.hidden = false
button.setTitle("2/2", forState: .Normal)
} else if button.titleLabel!.text == "2/2" {
charSet1.hidden = false
charSet2.hidden = true
button.setTitle("1/2", forState: .Normal)
}
}
字符集 如果您查看系统键盘,通常会在您点击某个键时以简短动画的形式显示一个指示。我们应该添加某种反馈,以便用户知道他们点击了正确的键。在 keyPressed() 方法的末尾添加以下内容。
UIView.animateWithDuration(0.2, animations: {
button.transform = CGAffineTransformScale(CGAffineTransformIdentity, 2.0, 2.0)
}, completion: {(_) -> Void in
button.transform =
CGAffineTransformScale(CGAffineTransformIdentity, 1, 1)
})
这会在恢复原始大小之前轻按按键时短暂放大。
最后我们将实现 Capslock 键 (CL)。修改capsLockPressed()函数如下。
@IBAction func capsLockPressed(button: UIButton) {
capsLockOn = !capsLockOn
changeCaps(row1)
changeCaps(row2)
changeCaps(row3)
changeCaps(row4)
}