當前位置:編程學習大全網 - 編程語言 - 如何在iOS 8下使用Swift設計壹個自定義的輸入法

如何在iOS 8下使用Swift設計壹個自定義的輸入法

我們會設計實現壹個簡單的輸入法,可以輸入 點 和 劃,改變了鍵盤結構,刪除字符然後隱藏自己。這個範例通過代碼來生成的用戶界面。當然,我們同樣也可以使用Nib文件來生成界面-這個會在教程的末尾涉及。加載Nib文件會對性能有負面影響。

創建壹個工程

打開Xcode6 ,創建壹個“Single Page Application”,然後選擇Swift為編程語言。

添加壹個文本區域

打開Main.storyboard然後拖拽壹個文本區域從組件庫裏。我們會使用這個來測試我們設計的鍵盤。

將這個文本區域居中,然後添加必要的contraints。

Hint: 如果妳調用 textField.becomeFirstResponder()在viewDidLoad ,這個鍵盤會自動在應用打開時彈出。

添加這個鍵盤擴展

從導航器中選擇這個項目文件,然後通過按+按鈕添加壹個新的target。

選擇Application Extension然後使用Custom Keyboard模板,命名它為MorseCodeKeyboard。

這會創建壹個名為 MorseCodeKeyboard 新文件夾,包括2個文件 KeyboardViewController.swift 和 Info.Plist。

接下來

打開 KeyboardViewController.swift,為了在不同的鍵盤之間進行切換,這個鍵盤模板文件會有壹個按鈕。在 viewDidLoad 方法中放入壹個新的方法,命名為 addNextKeyboardButton。

func addNextKeyboardButton() { self.nextKeyboardButton = UIButton.buttonWithType(.System) as UIButton ?... ?var nextKeyboardButtonBottomConstraint = NSLayoutConstraint(item: self.nextKeyboardButton, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 1.0, constant: -10.0) self.view.addConstraints([nextKeyboardButtonLeftSideConstraint, nextKeyboardButtonBottomConstraint]) }

為了更好的梳理代碼的結構,創建壹個新的方法名為addKeyboardButtons,然後在 viewDidLoad 中調用它。雖然這裏只有幾個按鈕,但是在真實項目中,將會有更多的按鈕。在 addKeyboardButtons 中調用 addNextKeyboardButton。

class KeyboardViewController: UIInputViewController { ?... ?override func viewDidLoad() { super.viewDidLoad() ?addKeyboardButtons() } ?func addKeyboardButtons() { addNextKeyboardButton() } ?... ?}

現在我們來添加點按鈕,創建壹個UIButton!類型的dotButton屬性。

class KeyboardViewController: UIInputViewController { ?var nextKeyboardButton: UIButton! var dotButton: UIButton! ?... }

增加壹個名為 addDot 的方法。使用系統按鈕來初始化名為 dotButton 的屬性。增加壹個 TouchUpInside 事件回調函數。設置壹個大字體然後增加圓角,同時增加約束來限制它距離水平中心50個points,垂直居中。這個代碼應該和下面nextKeyboardButton部分類似。

func addDot() { // initialize the button dotButton = UIButton.buttonWithType(.System) as UIButton dotButton.setTitle(".", forState: .Normal) dotButton.sizeToFit() dotButton.setTranslatesAutoresizingMaskIntoConstraints(false) ?// adding a callback dotButton.addTarget(self, action: "didTapDot", forControlEvents: .TouchUpInside) ?// make the font bigger dotButton.titleLabel.font = UIFont.systemFontOfSize(32) ?// add rounded corners dotButton.backgroundColor = UIColor(white: 0.9, alpha: 1) dotButton.layer.cornerRadius = 5 ?view.addSubview(dotButton) ?// makes the vertical centers equa; var dotCenterYConstraint = NSLayoutConstraint(item: dotButton, attribute: .CenterY, relatedBy: .Equal, toItem: view, attribute: .CenterY, multiplier: 1.0, constant: 0) ?// set the button 50 points to the left (-) of the horizontal center var dotCenterXConstraint = NSLayoutConstraint(item: dotButton, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1.0, constant: -50) ?view.addConstraints([dotCenterXConstraint, dotCenterYConstraint]) }

接下來對於dash,delete 和 hideKeyboard,這個過程都比較類似。這個deleteButton會從proxy使用deleteBackward方法,然後hideKeyboardButton會通過KeyboardViewController使用dismissKeyboard方法。

與dash相關的代碼幾乎和dotButton代碼壹致。為了將dashButton按鈕在水平方向與 點 按鈕對稱,只要將水平約束中的常量改變壹下符號即可。

func addDash() { ... ?// set the button 50 points to the left (-) of the horizontal center var dotCenterXConstraint = NSLayoutConstraint(item: dotButton, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1.0, constant: -50) ?view.addConstraints([dashCenterXConstraint, dashCenterYConstraint])

回刪

當被按下時,這個刪除按鈕會通過textDocumentProxy,使用deleteBackword刪除字符。這個布局約束會和nextKeyboardButton對稱(.Left -> .Right, .Bottom->.Top)

func addDelete() { deleteButton = UIButton.buttonWithType(.System) as UIButton deleteButton.setTitle(" Delete ", forState: .Normal) deleteButton.sizeToFit() deleteButton.setTranslatesAutoresizingMaskIntoConstraints(false) deleteButton.addTarget(self, action: "didTapDelete", forControlEvents: .TouchUpInside) ?deleteButton.backgroundColor = UIColor(white: 0.9, alpha: 1) deleteButton.layer.cornerRadius = 5 ?view.addSubview(deleteButton) ?var rightSideConstraint = NSLayoutConstraint(item: deleteButton, attribute: .Right, relatedBy: .Equal, toItem: view, attribute: .Right, multiplier: 1.0, constant: -10.0) ?var topConstraint = NSLayoutConstraint(item: deleteButton, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1.0, constant: +10.0) ?view.addConstraints([rightSideConstraint, topConstraint])

隱藏鍵盤

當被按下時,這個hideKeyboardButton會在KeyboardViewController上調用dismissKeyboard。

func addHideKeyboardButton() { hideKeyboardButton = UIButton.buttonWithType(.System) as UIButton ?hideKeyboardButton.setTitle("Hide Keyboard", forState: .Normal) hideKeyboardButton.sizeToFit() hideKeyboardButton.setTranslatesAutoresizingMaskIntoConstraints(false) ?hideKeyboardButton.addTarget(self, action: "dismissKeyboard", forControlEvents: .TouchUpInside) ?view.addSubview(hideKeyboardButton) ?var rightSideConstraint = NSLayoutConstraint(item: hideKeyboardButton, attribute: .Right, relatedBy: .Equal, toItem: view, attribute: .Right, multiplier: 1.0, constant: -10.0) ?var bottomConstraint = NSLayoutConstraint(item: hideKeyboardButton, attribute: .Bottom, relatedBy: .Equal, toItem: view, attribute: .Bottom, multiplier: 1.0, constant: -10.0) ?view.addConstraints([rightSideConstraint, bottomConstraint]) }

使用Nib文件

如果寫約束並非妳擅長的方式,妳可以創建壹個界面文件,然後將它添加到妳的inputView。

創建壹個界面文件

右擊MorseCodeKeyboard文件組,然後選擇創建新文件。

選擇User Interface,然後View Template,命名為CustomKeyboardInterface。

  • 上一篇:java經典編程案例有哪些?
  • 下一篇:摩根大通的 Quantitative Research 職位需要什麽專業技能
  • copyright 2024編程學習大全網