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

2024-01-30

如何向 .DecimalPad 类型 iOS 键盘添加减号,就像下面链接中的应用程序一样?如果我错了,请纠正我,但这对我来说似乎不是一个自定义键盘,它看起来像是苹果公司的默认十进制键盘......

带减号的十进制键盘 https://i.stack.imgur.com/aYQMa.jpg


要向键盘添加一些键,请打开 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 创建按钮。

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

选择笔尖的视图,然后在属性检查器中,将其大小设置为自由形式,将状态栏设置为无。然后转到 Size Inspector 并将其宽度设置为 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

选择“-”按钮并在 Superview 中添加一个前导空格为 5。

选择“-”并在“大小检查器”中,确保其“S ie 的前导空格”设置为常量 5。

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

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

interface_builder_ui

要为按键创建出口和操作,请从文档大纲中选择文件的所有者,然后在身份检查器中将类设置为 KeyboardViewController。然后,您可以像通常在故事板文件中那样通过按住 Control 键从控件拖动到视图控制器类来创建操作和出口。 (您将在下面的示例中看到更多内容)。

现在我们已经了解了如何以编程方式并使用 nib 文件创建键盘的 UI,让我们为其添加一些功能。为此,我有一个我们将使用的入门项目。该项目是一个简单的键盘,我们将向其添加一些功能。如下所示。您应该注意,为了简单起见,我没有针对所有尺寸类别进行设计,因此,虽然它在 iPhone 5S 上看起来不错,但在更大的屏幕上看起来并不完全相同。您可以在此处下载代码。另请注意,键盘的名称是 Appcoda Keyboard,而不是我们之前的 AC 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 插入到当前文本输入对象的插入点。我们输入的所有字母都将大写,但我们很快就会解决这个问题。接下来修改以下函数,分别设置退格(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)
    })

这使得按键在点击时会短暂放大,然后又恢复到原始大小。

最后我们将实现 Caps Lock 键(CLI)。如下修改 caps Lock Pressed() 函数。

@IBAction func capsLockPressed(button: UIButton) {
    capsLockOn = !capsLockOn

    changeCaps(row1)
    changeCaps(row2)
    changeCaps(row3)
    changeCaps(row4)
}

参考 http://www.appcoda.com/custom-keyboard-tutorial/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何向 .DecimalPad iOS 键盘添加减号? 的相关文章

随机推荐

  • AppCompatActivity 已弃用 onActivityResult()

    我在用应用内更新适用于 android 和 as根据文档 https developer android com guide playcore in app updates kotlin 他们使用 onActivityResult 来处理应
  • 证明具有 n 个叶子的二叉树的高度至少为 log n

    我已经能够创建一个证明 显示树中的最大总节点数等于 n 2 h 1 1 并且从逻辑上我知道二叉树的高度是 log n 可以绘制它出来看看 但我很难构建一个正式的证明来证明一棵有 n 片叶子的树 至少 有 log n 我遇到或能够组合在一起的
  • WPF 按钮中的文本内容未垂直居中

    WPF 按钮的文本内容在文本上方出现不需要的空格是否有原因 我在 StackPanel 中有一个按钮 这个按钮是一个简单的关闭按钮 所以我希望它显示为一个方形按钮 中间有一个 x 我已将填充设置为零 并将 Horizo ntalConten
  • 如何安装旧版本的 postgresql 和 postgis?

    我是 Linux 新手 我发现安装旧版本的 postgresql 以及 postgis 真的很困难 我已经卸载了在 aptidude 中可以找到的连接到 postgresql 的所有内容 由于只能通过 apt get install 获得最
  • 像 .map() 这样的高阶函数在 JavaScript 内部是如何工作的?

    现在每个人都尝试使用这些高阶函数 https en wikipedia org wiki Higher order function通过编写更少的代码获得有希望的结果 但我想知道这些函数内部是如何工作的 假设我写了类似的东西 var num
  • LibGDX 网格高度图法线和灯光

    我正在尝试让网格法线和灯光在 LibGDX 项目中工作 我已经有了从高度图纹理像素生成的纹理网格 问题是我无法正确点亮法线 另外 我不能 100 确定我在 TerrainChunk 类中正确设置了法线顶点 这是主类代码 package co
  • staggerChildren 与成帧器运动

    我在使成帧器运动 staggerChildren 过渡到处理简单的项目列表时遇到一些问题 它基本上允许子组件的动画交错 我为父容器和子容器设置了这样的动画属性 const container hidden opacity 0 show op
  • ArrayCollection:以表单形式检索集合

    我使用 Symfony2 制作了一个 Web 应用程序 其中用户与实体 Mission 具有数组关联 ManytoMany 用户可以通过表单上传实体 product 表单传递的数据之一是与用户关联的任务 每个用户都有不止一个任务 因此 当他
  • 页脚在底部有CSS网格吗?想不通吗?

    我看过其他教程 了解如何在内容很少时使用 css 网格使页脚粘在底部 但我无法弄清楚 如果你能帮忙 那就太好了 我正在学习 css grid 我花了几天时间断断续续地试图弄清楚它 margin 0 padding 0 color fffff
  • 错误:“文件‘/MasterPages/MainMaster.master’不存在。” (是的,这个文件确实存在!)

    我刚买了一台新的台式电脑 操作系统为 Windows 7 Pro 我在这台新计算机上安装了 Visual Studio 2008 并尝试打开以前存在的 ASP NET 3 5 解决方案 该解决方案在我以前的计算机上显示得非常好 以前的计算机
  • Chrome.system.cpu API 使用情况

    是否可以使用 chrome system cpu api 获取当前 CPU 负载 我特别不知道如何将返回的数字转换为总电流负载的百分比 我发现了这一点 但不太确定如何实现 调用者可以通过进行两次调用 减去时间并除以总时间差来计算负载分数 h
  • 减小折叠菜单的宽度

    在下面的代码中 当单击折叠菜单时 会提供一个与页面全宽的下拉菜单 div class row div class col sm 8 div class navbar header div div div
  • Angular 2 双向数据绑定不起作用

    我在 Angular 2 中获取自定义双向数据绑定时遇到问题 文档表明盒子模型中的香蕉 只是语法糖 但是在我的示例中 这种方式不起作用 而且时间更长方法的工作原理
  • ggplot 中轴/变量标签的键值映射

    我经常使用具有 R 友好 程序员友好 列名称的数据框 通常没有空格和 或缩写 在进行分析时懒于输入全名 例如 ir lt data frame sp iris Species sep len iris Sepal Length sep wi
  • Long 不能取消引用

    我几乎做了一切来解决 长不能取消引用 这个恼人的问题 但一切都解决了 因此 有人可以帮助我吗 问题是当我检查程序是否超时时if System currentTimeMillis longValue finish 比较不起作用 public
  • Sql ServerPreparedStatement为SQL“in(?)”子句设置参数

    我有一个sql看起来像这样 SELECT FROM T TABLE WHERE ID IN 我想设置参数IN via PrepareStatement 我认为所需的方法如下所示 prepareStatement setList 1 Arra
  • 为什么不是 scanf("%*[^\n]\n");和 scanf("%*[^\n]%*c");清除悬挂的换行符?

    拨打电话后scanf d variable 我们留下了一个换行符挂在stdin 应在调用之前清除fgets 或者我们最终给它提供一个换行符并使其过早返回 我找到了建议使用的答案scanf n c 第一次致电后scanf放弃换行符和其他建议使
  • oracle查询比较表中具有相同id的所有行

    需要一个 sql 查询来生成具有相同 id 的状态为完整的记录 例如 mytable是包含各种记录的表名 我们需要找到同一 ID 的所有状态为完整的 ID id status 12 complete 12 required 12 activ
  • Google 网站管理员工具 API:通过 OAUTH2 下载查询

    我正在尝试使用 Google 的网站管理员工具 API 下载最近搜索查询的 CSV 文件 我知道如何使用他们的 Python 示例来做到这一点http googlewebmastercentral blogspot com 2011 12
  • 如何向 .DecimalPad iOS 键盘添加减号?

    如何向 DecimalPad 类型 iOS 键盘添加减号 就像下面链接中的应用程序一样 如果我错了 请纠正我 但这对我来说似乎不是一个自定义键盘 它看起来像是苹果公司的默认十进制键盘 带减号的十进制键盘 https i stack imgu