如何在.DecimalPad iOS键盘上添加减号?

时间:2015-01-23 01:04:33

标签: ios swift xcode button keyboard

如何从.DecimalPad类型的iOS键盘添加减号,如下面的链接中的应用程序?如果我错了,请纠正我,但这对我来说似乎不是一个自定义键盘,它看起来像Apple的默认小数键盘给我......

Decimal keypad with a minus sign

1 个答案:

答案 0 :(得分:1)

要向键盘添加一些键,请打开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将其插入当前文本输入对象的插入点。这是一个符合UITextDocumentProxy协议的对象,该协议充当键盘和召唤它的文本输入对象之间的代理。

接下来,我们添加addConstraints()方法,该方法将为按钮和containsView添加约束。

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来创建按钮。

导航到File>创建一个nib文件。新>文件> iOS>用户界面>视图。将其命名为KeyboardView并确保它位于AC Keyboard目标下。

选择笔尖视图,然后在“属性”检查器中,将“大小”设置为“自由形式”,将“状态栏”设置为“无”。然后转到尺寸检查器并将其宽度设置为320,将高度设置为220。

在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;

将视图添加到笔尖的主视图中。单击Interface Builder界面底部的Pin菜单,并为其指定以下约束 - 高度为40,尾随空格为0,前导空格为0,顶部空间为容器为42.确保未选中“约束到边距”。

add_constraints

在视图中添加一个按钮。将文本颜色设置为深灰色并更改标题。现在为了约束。

使用每个按钮,选择“对齐”菜单,然后选择“容器中的垂直中心”。

alignment auto layout

选择' - '按钮并为超级视图添加前导空格5。

选择' - '并在尺寸检查器中,确保其前导空间为S,即设为常数5.

选择主视图,然后选择编辑器>解决自动布局问题>所有视图>更新框架。

运行该应用程序,您应该会看到刚刚添加的密钥设置在代码中添加的密钥下面。

interface_builder_ui

要为密钥创建出口和操作,请从文档大纲中选择文件所有者,然后在Identity Inspector中将类设置为KeyboardViewController。然后,您可以通过控件从控件拖动到视图控制器类,像在故事板文件中一样创建操作和出口。 (您将在后面的示例中看到更多这样的内容。)

现在我们已经了解了如何以编程方式创建键盘的UI并使用nib文件,让我们为它添加一些功能。为此,我有一个我们将要使用的入门项目。该项目是一个简单的键盘,我们将添加一些功能。如下所示。您应该注意,为了保持简单,我没有为所有尺寸类设计,所以,虽然它在iPhone 5S上看起来不错,但对于更大的屏幕看起来并不完全相同。您可以在此处下载代码。另请注意,键盘的名称是Appcoda键盘,而不是我们之前使用的AC键盘。

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插入当前文本输入对象的插入点。我们输入的所有字母都将在Caps中,但我们很快就会解决这个问题。接下来修改以下函数以分别为退格(BS),空格(SPACE)和返回(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")
}

运行应用程序并测试密钥。

在视图文件中,您会注意到两个视图标记为字符集1和字符集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)
}

Reference