iOS8自定义输入法教程:如何创建第三方输入法

Create-Custom-Keyboard-for-iOS8:iOS 8具有市场上的一些激动人心的功能。 自定义键盘是最重要的新增功能之一。 苹果终于允许第三方开发人员为iOS开发键盘应用程序。 在本教程中,我们将快速创建一个演示应用程序,并添加一个自定义键盘 为iOS8创建自定义键盘 iOS 8具有市场上的一些激动人心的功能。 自定义键盘是最重要的新增功能之一。 苹果终于允许第三方开发人员为iOS开发键盘应用程序。 在本教程中,我们将快速创建一个演示应用程序,并添加一个自定义键盘。 您可以在此处找到有关如何使用代码库的完整教程: 本教程由The App Guruz提出-最好的 立即下载

转自:http://www.cocoachina.com/ios/20140922/9706.html

iOS8带来了很多很酷的功能,其中一个就是增加第三方输入法作为应用程序扩展。我们应当重视这个时刻,因为应用程序扩展开辟了一个全新的应用程序种类以及付费操作。凭借着在应用商店中数百万的应用程序,开发者和用户将迎来全新的一天。
 
在本帖中,我将向您展示如何为您的应用程序创建一个可进行全系统输入法操作的第三方输入法。
 
本教程将用Swift来完成。这是我的第一个真正用Swift语言完成的项目,我对其十分喜爱。现在,让我们直接研究如何创建一个第三方输入法。
 
首先,我先向大家展示一下我们要搭建的输入法的最终效果图。输入法将能够在文本框中输入、删除文字以及实现其他基本功能。诸如上下文预测、词典等更为高级的功能超出了本教程的范围。 
 
输入法效果图
创建Xcode项目
打开Xcode 6并创建一个新项目。File->New->Project
 
给工程命名为CustomKeyboardSample并在恰当的位置保存。这是我们的主项目,但是我们还需要添加扩展。
 
现在,让我们往项目中添加一个Text Field。打开Main.Storyboard文件然后在屏幕上的视图控制器上拖放一个UITextField控件。
 
 
StoryBoard效果
这是我们用来测试输入的地方。现在是时候来添加扩展了。
 
点击File-> New -> Target,选择在iOS/Application Extension列表中的自定义输入法(Custom Keyboard)。给该扩展命名为CustomKeyboard并选择Swift编程语言。
 
添加扩展
现在你应该有一个名为CustomKeyboard的新目标文件夹,其中有一个名为KeyboardViewController.swift文件。 Xcode中已经为我们增加了一些初始代码和这个键盘应该可以运行了(尽管没有什么功能)。
 
现在,您可以尝试运行CustomKeyboardSample,并尝试新的输入法。
 
当你点击文本框的时候,系统键盘会显示出来。我们可以使用底排的地球图标来切换输入法,但是我们只有安装我们的新键盘后,这个图标才会显示出来。
 
转到主屏幕(点击菜单栏,Hardware->Home)。打开设置并转到通用->键盘->键盘。点击“添加新键盘”,然后选择CustomKeyboard。 打开开关来启用它并同意警告信息。
 
点击完成,您可以准备好开始了!
 
如果在模拟器上再次运行该应用程序,那么就可以切换输入法。点击地球图标,直到你看到只有“Next Keyboard”按钮的键盘。
 
现在是时候开始添加输入法的按键了。
 
打开文件KeyboardViewController.h。在这个文件中,你会看到一个类KeyboardViewController继承自UIInputViewController。这是管理视图的键盘类。我们可以向包含视图中添加按钮,它会在键盘中显示出来。
添加一个名为createButton的函数
 
  1. func createButtonWithTitle(title: String) -> UIButton { 
  2.     let button = UIButton.buttonWithType(.System) as UIButton 
  3.     button.frame = CGRectMake(0, 0, 20, 20) 
  4.     button.setTitle(title, forState: .Normal) 
  5.     button.sizeToFit() 
  6.     button.titleLabel.font = UIFont.systemFontOfSize(15) 
  7.     button.setTranslatesAutoresizingMaskIntoConstraints(false) 
  8.     button.backgroundColor = UIColor(white: 1.0, alpha: 1.0) 
  9.     button.setTitleColor(UIColor.darkGrayColor(), forState: .Normal) 
  10.     button.addTarget(self, action: "didTapButton:", forControlEvents: .TouchUpInside) 
  11.     return button 
  12.     } 
 
在上面的代码中,我们以编程的方式来添加一个按钮,并设置其属性。我们可以用nib文件来实现,但我们将不得不管理如此之多的按钮。因此这是一个更好的选择。
 
该代码会调用一个名为didTapButton的响应按钮被按下的方法。现在让我们添加一个方法。
 
 
  1. func didTapButton(sender: AnyObject?) { 
  2.     let button = sender as UIButton 
  3.     let title = button.titleForState(.Normal) 
  4.     var proxy = textDocumentProxy as UITextDocumentProxy 
  5.  
  6.     proxy.insertText(title) 
  7.     } 
在上面的方法中,我们用swift实现了对一个按钮事件的处理。AnyObject类型就像是在Objective-C中的ID的对象。我们给UIButton放置了一个传送器,然后得到该按钮的标题文字,这些文字是我们要在文本框中要输入的文本文字。
 
要使用输入法输入文本,我们使用textDocumentProxy对象,并调用insertText方法。
 
接下来的一步是添加一个按钮到我们的键盘视图。在viewDidLoad方法下面加入两行代码。您可以在viewDidLoad和textDidChange方法中删除自动生成的代码。
 
  1. override func viewDidLoad() { 
  2.    super.viewDidLoad() 
  3.  
  4.    let button = createButtonWithTitle("A")                        
  5.    self.view.addSubview(button) 
  6.    } 
增加了标题为“A”到输入法的按钮。这是我们的关键所在。
 
现在,运行应用程序,然后点击文本框,你应该可以看到键盘的”A”键。 (你可能需要切换键盘)。
 
点击这个按钮,看看会发生什么......看!我们已经有了文字A!
 
输入效果
好吧,让我们添加更多的按键,让这个小子看起来像一个真正的输入法。
 
让我们修改我们在viewDidLoad方法中加入的代码。
 
 
  1. override func viewDidLoad() { 
  2.    super.viewDidLoad() 
  3.  
  4.    let buttonTitles = ["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"] 
  5.    var buttons = UIButton[]() 
  6.    var keyboardRowView = UIView(frame: CGRectMake(0, 0, 320, 50)) 
  7.  
  8.    for buttonTitle in buttonTitles{ 
  9.        let button = createButtonWithTitle(buttonTitle) 
  10.        buttons.append(button) 
  11.        keyboardRowView.addSubview(button) 
  12.        } 
  13.  
  14.    self.view.addSubview(keyboardRowView)   
 
现在有了这个新的代码,我们创建了一个包含按键标题的数组,同时我们也创造了包含这些按键的列表。每个按键都被添加到一个数组和一个UIView中,这将是我们的第一排键列。然后向主键盘图中添加该视图。
 
如果你运行这个程序,你可能只看到了P键,因为所有的按钮都在同一位置。我们需要以编程方式添加一些约束,使他们能够在一排对齐。
 
因此,我们将创建一个新的函数来创建约束。
 
  1. func addIndividualButtonConstraints(buttons: UIButton[], mainView: UIView){ 
  2.     for (index, button) in enumerate(buttons) { 
  3.  
  4.     var topConstraint = NSLayoutConstraint(item: button, attribute: .Top, relatedBy: .Equal, toItem: mainView, attribute: .Top, multiplier: 1.0, constant: 1) 
  5.  
  6.     var bottomConstraint = NSLayoutConstraint(item: button, attribute: .Bottom, relatedBy: .Equal, toItem: mainView, attribute: .Bottom, multiplier: 1.0, constant: -1) 
  7.  
  8.     var rightConstraint : NSLayoutConstraint! 
  9.  
  10.     if index == buttons.count - 1 { 
  11.  
  12.         rightConstraint = NSLayoutConstraint(item: button, attribute: .Right, relatedBy: .Equal, toItem: mainView, attribute: .Right, multiplier: 1.0, constant: -1) 
  13.  
  14.     }else{ 
  15.  
  16.     let nextButton = buttons[index+1] 
  17.     rightConstraint = NSLayoutConstraint(item: button, attribute: .Right, relatedBy: .Equal, toItem: nextButton, attribute: .Left, multiplier: 1.0, constant: -1) 
  18.             } 
  19.  
  20.     var leftConstraint : NSLayoutConstraint! 
  21.  
  22.     if index == 0 { 
  23.  
  24.         leftConstraint = NSLayoutConstraint(item: button, attribute: .Left, relatedBy: .Equal, toItem: mainView, attribute: .Left, multiplier: 1.0, constant: 1) 
  25.  
  26.     }else{ 
  27.  
  28.         let prevtButton = buttons[index-1] 
  29.         leftConstraint = NSLayoutConstraint(item: button, attribute: .Left, relatedBy: .Equal, toItem: prevtButton, attribute: .Right, multiplier: 1.0, constant: 1) 
  30.  
  31.         let firstButton = buttons[0] 
  32.         var widthConstraint = NSLayoutConstraint(item: firstButton, attribute: .Width, relatedBy: .Equal, toItem: button, attribute: .Width, multiplier: 1.0, constant: 0) 
  33.  
  34.         mainView.addConstraint(widthConstraint) 
  35.     } 
  36.  
  37.     mainView.addConstraints([topConstraint, bottomConstraint, rightConstraint, leftConstraint]) 
  38.     } 
  39. } 
这是一个很长的代码,不是吗?有了AutoLayout,你不能真正建立起它并且你需要立即添加所有约束,否则它将不工作。上面代码的主要工作是添加边界为1px的约束,这些约束将添加到每个按键的顶部和底部。它也增加了左右两边边界为1px的约束,添加到相邻键的左边和右边(或添加到行视图,如果它是该行中的第一个或最后一个键的话)。
 
如果在viewDidLoad中添加调用上面函数的功能,我们应该可以看到新的排按键显示出来。
排按键
现在,这看起来更像是一个输入法了。接下来的步骤是添加输入法的其他行。要做到这一点,让我们做一些快速重构。创建并实现添加每行按键的新方法。
 
  1. func createRowOfButtons(buttonTitles: NSString[]) -> UIView { 
  2.  
  3.     var buttons = UIButton[]() 
  4.     var keyboardRowView = UIView(frame: CGRectMake(0, 0, 320, 50)) 
  5.  
  6.     for buttonTitle in buttonTitles{ 
  7.         let button = createButtonWithTitle(buttonTitle) 
  8.         buttons.append(button) 
  9.         keyboardRowView.addSubview(button) 
  10.     } 
  11.  
  12.     addIndividualButtonConstraints(buttons, mainView: keyboardRowView) 
  13.  
  14.     return keyboardRowView 
  15. } 
我们已经基本将viewDidLoad中的代码提取到它自己的方法中。这种新的方法将标题文字存放在数列中,并返回包含该行所有按钮的视图。现在,我们可以在任何一个我们想要添加的代码中调用这段代码。
 
因此,我们的新vieDidLoad方法是这样的:
 
  1. override func viewDidLoad() { 
  2.     super.viewDidLoad() 
  3.  
  4.     let buttonTitles1 = ["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"] 
  5.     let buttonTitles2 = ["A", "S", "D", "F", "G", "H", "J", "K", "L"] 
  6.     let buttonTitles3 = ["CP", "Z", "X", "C", "V", "B", "N", "M", "BP"] 
  7.     let buttonTitles4 = ["CHG", "SPACE", "RETURN"] 
  8.  
  9.     var row1 = createRowOfButtons(buttonTitles1) 
  10.     var row2 = createRowOfButtons(buttonTitles2) 
  11.     var row3 = createRowOfButtons(buttonTitles3) 
  12.     var row4 = createRowOfButtons(buttonTitles4) 
  13.  
  14.     self.view.addSubview(row1) 
  15.     self.view.addSubview(row2) 
  16.     self.view.addSubview(row3) 
  17.     self.view.addSubview(row4) 
  18.  
  19. } 
在上面的代码中,我们已经加入4行键,然后加入这些按键,后者又被添加到主视图中的行中。
 
我们现在可以运行代码,但你只能看到最后一排,因为他们都在同一位置。 我们需要添加一些自动布局的约束。
 
  1. func addConstraintsToInputView(inputView: UIView, rowViews: UIView[]){ 
  2.  
  3.     for (index, rowView) in enumerate(rowViews) { 
  4.         var rightSideConstraint = NSLayoutConstraint(item: rowView, attribute: .Right, relatedBy: .Equal, toItem: inputView, attribute: .Right, multiplier: 1.0, constant: -1) 
  5.  
  6.         var leftConstraint = NSLayoutConstraint(item: rowView, attribute: .Left, relatedBy: .Equal, toItem: inputView, attribute: .Left, multiplier: 1.0, constant: 1) 
  7.  
  8.         inputView.addConstraints([leftConstraint, rightSideConstraint]) 
  9.  
  10.         var topConstraint: NSLayoutConstraint 
  11.  
  12.         if index == 0 { 
  13.             topConstraint = NSLayoutConstraint(item: rowView, attribute: .Top, relatedBy: .Equal, toItem: inputView, attribute: .Top, multiplier: 1.0, constant: 0) 
  14.  
  15.         }else{ 
  16.  
  17.             let prevRow = rowViews[index-1] 
  18.             topConstraint = NSLayoutConstraint(item: rowView, attribute: .Top, relatedBy: .Equal, toItem: prevRow, attribute: .Bottom, multiplier: 1.0, constant: 0) 
  19.  
  20.             let firstRow = rowViews[0] 
  21.             var heightConstraint = NSLayoutConstraint(item: firstRow, attribute: .Height, relatedBy: .Equal, toItem: rowView, attribute: .Height, multiplier: 1.0, constant: 0) 
  22.  
  23.             inputView.addConstraint(heightConstraint) 
  24.         } 
  25.     inputView.addConstraint(topConstraint) 
  26.  
  27.     var bottomConstraint: NSLayoutConstraint 
  28.  
  29.     if index == rowViews.count - 1 { 
  30.         bottomConstraint = NSLayoutConstraint(item: rowView, attribute: .Bottom, relatedBy: .Equal, toItem: inputView, attribute: .Bottom, multiplier: 1.0, constant: 0) 
  31.  
  32.     }else{ 
  33.  
  34.         let nextRow = rowViews[index+1] 
  35.         bottomConstraint = NSLayoutConstraint(item: rowView, attribute: .Bottom, relatedBy: .Equal, toItem: nextRow, attribute: .Top, multiplier: 1.0, constant: 0) 
  36.     } 
  37.  
  38.     inputView.addConstraint(bottomConstraint) 
  39.     } 
  40. } 
这种新方法做了类似的功能,我们增加了最后的自动布局代码。它增加了相对于主视图向行的左右两边以及下面的1px的约束和添加每一行和和它上面行之间的0px约束。
 
现在,我们需要从我们的viewDidLoad方法中调用这段代码。
 
  1. override func viewDidLoad() { 
  2.     super.viewDidLoad() 
  3.  
  4.     let buttonTitles1 = ["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"] 
  5.     let buttonTitles2 = ["A", "S", "D", "F", "G", "H", "J", "K", "L"] 
  6.     let buttonTitles3 = ["CP", "Z", "X", "C", "V", "B", "N", "M", "BP"] 
  7.     let buttonTitles4 = ["CHG", "SPACE", "RETURN"] 
  8.  
  9.     var row1 = createRowOfButtons(buttonTitles1) 
  10.     var row2 = createRowOfButtons(buttonTitles2) 
  11.     var row3 = createRowOfButtons(buttonTitles3) 
  12.     var row4 = createRowOfButtons(buttonTitles4) 
  13.  
  14.     self.view.addSubview(row1) 
  15.     self.view.addSubview(row2) 
  16.     self.view.addSubview(row3) 
  17.     self.view.addSubview(row4) 
  18.  
  19.     row1.setTranslatesAutoresizingMaskIntoConstraints(false) 
  20.     row2.setTranslatesAutoresizingMaskIntoConstraints(false) 
  21.     row3.setTranslatesAutoresizingMaskIntoConstraints(false) 
  22.     row4.setTranslatesAutoresizingMaskIntoConstraints(false) 
  23.  
  24.     addConstraintsToInputView(self.view, rowViews: [row1, row2, row3, row4]) 
  25. } 
这是我们新的viewDidLoad函数。你会看到,我们把每一行的TranslatesAutoresizingMaskIntoConstraints设为了false。这是为了确保更好的使用自动布局的方法,而不是使用约束的布局。
 
现在,如果你运行应用程序,你会看到输入法均能正常自如地布局。您可以点击所有的按钮,看看它们输入到文本框中。
成品图
还有一个小问题,非文本键无法正常工作(例如,退格键,空格键)。
 
为了解决这个问题,我们需要改变我们的didTapButton方法来添加响应这些键的正确方法。
 
  1. func didTapButton(sender: AnyObject?) { 
  2.  
  3.     let button = sender as UIButton 
  4.     let title = button.titleForState(.Normal) as String 
  5.     var proxy = textDocumentProxy as UITextDocumentProxy 
  6.  
  7.     proxy.insertText(title) 
  8.  
  9.     switch title { 
  10.     case "BP" : 
  11.         proxy.deleteBackward() 
  12.     case "RETURN" : 
  13.         proxy.insertText("\n") 
  14.     case "SPACE" : 
  15.         proxy.insertText(" ") 
  16.     case "CHG" : 
  17.         self.advanceToNextInputMode() 
  18.     default : 
  19.         proxy.insertText(title) 
  20.     } 
  21. } 
这里用switch语句来对按下的键进行识别处理。退格键调用代理上的deleteBackward方法,空格键插入一个空格和CHG键改变输入法或者系统输入法或安装下一个输入法。
 
下一步是什么?
教程就到这里,本教程就如何创建一个基本的自定义键盘进行了一个粗略的讲解。你的作业是这个进一步优化,看看您是否可以添加更高级的功能,如使用Caps Lock键添加大写字母,切换到数字/符号键盘方案等。
 
 

CustomKeyboard(iPhone源代码) 来源:Licence:MIT作者:ゞ灬絆玍橼╰→     自定义键盘,能实现输入框随着文字的数量改变其自身高度大小。点击空白的地方能够把键盘收起来。          小编注:感谢用户@ゞ灬絆玍橼╰→ ! 立即下载

相关推荐

Custom iOS Keyboard(iPhone源代码)

来源:Licence:MIT平台:iOS设备:iPhone / iPad作者:Kulpreet Chilana     完全自定义键盘,能够自定义键盘上每个按键的字母,并能让其看起来像iOS的原生键盘一样。支持iPhone以及iPad。Demo中自定义键盘为Punjabi(旁遮普省)语言(印度的一种语言),这是iOS自带语言中没有的。    小编注:什么时候有用呢?但iOS自带语言不能满足你的需求的时候,虽然很少会发生,但,who knows。比如,你要为非洲某食人部落开发app,但是iOS自带的语言键盘没有他们的语言,这时候你就用到这份代码了:)    Code4App编译测试,适用环境:

ios自定义第三方输入法

iOS第三方输入法

qq_43658148的博客 4317

Rust 编译工具链配置指南:从 link.exe 缺失到完美解决

本文详细解析了Windows下Rust编译时常见的'link.exe not found'错误,提供了MSVC和MinGW-w64两种工具链的完整配置指南。从Visual Studio组件安装到环境变量设置,再到疑难排查技巧,帮助开发者彻底解决Rust编译工具链配置问题,提升开发效率。

earth的博客 318

iOS输入法开发(Swift)

我会复习一下有关键盘扩展的内容,然后通过使用iOS 8中的新应用扩展API的设计一个摩斯码的输入法。完成这个教程大约需要花费20分钟。完整代码   概览 通过使用自定义输入法替换系统输入法,用户可以实现一些特别的功能。例如一个特别新颖的输入方式,或输入iOS原生并不支持的语言。自定义输入法的基本功能很简单:通过点击、手势,或者其他输入事件,然后通过一个未分类的 NSString

SHZnt的博客 5413

STM32H7 FOC控制时序优化与PWM中点更新策略

在永磁同步电机(PMSM)的磁场定向控制(FOC)系统中,控制时序精度是决定电流环带宽、观测器收敛性与动态响应能力的基础要素。其核心在于理解PWM生成、ADC采样与控制计算三者之间的硬件级时间耦合关系——尤其在中心对齐模式下,标准更新机制引入的半周期延迟会破坏电压-电流瞬时映射,导致滑模观测器失配与高频相位滞后。通过将PWM更新事件绑定至重复计数器(RCR)清零点,可实现控制指令在开关周期中点生效,使等效电压矢量中心与计算时刻严格对齐。该策略显著提升系统确定性,为20 kHz以上高频电流环提供物理支撑,并广

flink9streamer的博客 857

第8章 Stata主成分分析与因子分析

在进行数据统计分析时,还往往会遇见变量特别多的情况,而且很多时候这些变量之间还存在着很强的相关关系或者说变量之间存在着很强的信息重叠,如果我们直接对数据进行分析,一方面会带来工作量的无畏的加大,另一方面还会出现一些模型应用的错误,于是主成分分析与因子分析应运而生。这两种分析方法的基本思想都是在不损失大量信息的前提下,利用较少的独立变量来替代原来的变量进行进一步的分析。 8.1主成分分析 基本思想是将众多的初始变量整合成少数几个互相无关的主成分变量,而这些新变量尽可能地包含...

qq_45112156的博客 5万+

[IOS]IOS8自定义输入法教程:如何创建第三方输入法

//转载:http://www.cocoachina.com/ios/20140922/9706.html iOS8带来了很多很酷的功能,其中一个就是增加第三方输入法作为应用程序扩展。我们应当重视这个时刻,因为应用程序扩展开辟了一个全新的应用程序种类以及付费操作。凭借着在应用商店中数百万的应用程序,开发者和用户将迎来全新的一天。   在本帖中,我将向您展示如何为您的应用程序创

欲买桂花同载酒,终不似,少年游。 1197

【亲测有效】OpenClaw Gateway 出现 “(no output)“ 卡死问题完整解决指南:从手动重启到 systemd Watchdog 自动恢复

最近在使用 OpenClaw(自托管 AI 助手框架,前身 Clawdbot/Moltbot)时,遇到了一个非常常见的顽疾:TUI(终端界面)或 Telegram 等通道经常显示 "(no output)",消息发出去后机器人完全没反应,看起来像是卡死了。

hampeter的博客 8609

ios 输入法扩展_GitHub - insoxin/pinyin: 一款iOS13第三方输入法,供分享、学习和拓展之用。...

INSO输入法-为输入提速! for iPhonehttps://pinyin.isoyu.com/一款iOS13第三方输入法,供分享、学习和拓展之用。iOS13第三方输入法实例-Swift版1、写这个项目的目的输入法开发在众多App中较为小众,因为现实中,不仅仅是输入个字母、数字、字符或者表情就行的。输入汉字,要想做到基本的需求,你得有联想、模糊查询、热词搜索、智能纠错、自定义词库等等,还不包括...

weixin_35779370的博客 1555

Android性能优化之Android Profiler

在移动应用开发中,打造一个流畅、省电且不卡顿的用户体验是至关重要的。然而,随着应用功能的日益复杂,内存泄漏、CPU暴涨、网络卡顿以及电量消耗过快等问题常常化身为隐形杀手,悄悄吞噬着用户体验。为了帮助开发者精准定位并解决这些性能瓶颈,谷歌在Android Studio中集成了一款强大的一站式性能分析工具Android Profiler。Android Profiler作为Android Studio内置的实时数据可视化工具,支持运行在Android 5.0及更高版本的设备上。

xiangzhihong8的专栏 201

【AI黑话日日新】什么是AI云原生?

云原生赋能AI:利用容器、微服务、Serverless、DevOps等云原生技术,解决AI应用(尤其是大模型)在部署、扩展、运维、成本控制方面的痛点,让AI服务具备高可用、高性能、易运维、易扩展的特性AI赋能云原生:将AI技术(如智能调度、异常检测、自动优化)融入云基础设施管理,使云平台具备自我感知、自我优化、自我修复的能力,从"被动响应"升级为"主动适配"其本质是实现从""(AI运行在云上)到""(为AI量身打造的云)的根本性转变。

专注:太空算力、AI infra、异构调度、大模型成本工程 627

iOS8.0+ 第三方输入法多次发送UIKeyboard相关的通知

在iOS8.0+的系统中提供了对第三方输入法的支持,这对广大的果粉来说或许是一个好消息,但对于万千的iOS应用程序开发人员来说跟关心的是产品经理是否又要根据这更改需求或是第三方输入法是否会引发什么不必要的bug,毕竟以前写的程序只针对系统输入法。不巧的是这样的事情就发生在最近开发的App中——使用第三方输入法会duo'c

u013016828的专栏 3500

新政下的绿电直连项目经济性分析:模式创新与价值重构

随着全球气候治理与低碳转型进程不断加速,绿电直连作为新能源就近消纳的创新模式,正成为破解新能源消纳瓶颈、规避碳关税壁垒的核心路径。2025年9月,国家发展改革委、国家能源局发布《关于完善价格机制促进新能源发电就近消纳的通知》(1192号文),为绿电直连项目的经济性分析与效益测算提供了明确的政策依据。本文将基于新政框架,深入解析绿电直连项目的经济性影响因素、盈利模式与优化路径,并结合案例与量化模型,为项目投资决策提供系统参考。

getusushu的博客 137

ios 输入法扩展_iOS8、iOS9都可用的原生输入法扩展词库(搜狗词库)

10月30日,苹果6S/6S+价格、苹果6/6+价格顺丰保价包邮,欢迎加微信咨询fbmu88表格里的价格涵盖了未拆封未激活全新iPhone 6S/6S+/6/6+官方标配版和顺丰保价包邮费用:[table “115” not found /][table “116” not found /]iOS8、iOS9都可用的原生输入法扩展词库(搜狗词库)水果大叔在一定程度上赞同『如果系统有,不碰第三方』这...

weixin_39981185的博客 3324

AMS TMF8820/21/28 SPAD 掩码和模式选择

为了实现最快的测距周期,将报告周期设置在测距周期以下的毫秒,以确保不会有等待时间。除了8X8固定了pixel的位置意外,其他模式客户可以设计自己的spad掩码,并将spad单独分配给通道。对于这些spad掩码,有一些约束。左下角提示红色代表光学中心,绿色方框表示单个spad,每个MP里可能有2X3个spad,也有2X5个spad,也有3X6+3个spad,这部分适配光学,最大的程度的利用spad区域。以下是几种预定义的spad掩码,非常灵活的配置,来适配各种3X3,4X4,8X8的模式选择。

dream it possible 700

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ios 输入法扩展_使用第三方 iOS 输入法前你应该知道什么?

iOS 8 一出,今天各路国内输入法开发商的「7 年之痒」终于解禁,一股脑的推出 iOS 版输入法抢占这块新矿区。微博上扫了一眼,用户们也是热情高涨,曾经的「越狱遮羞布」变成了人人标配的小手帕。但在这繁荣背后的隐患却鲜有人提及,我今天就以搜狗输入法聊聊 iOS 输入法开放后的隐私问题。搜狗输入法 for iOS下面的例子中使用的是 iOS 8 搜狗输入法 1.0.0 版。首先,输入法的智能联想带有...

weixin_31499265的博客 920

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ios 输入法扩展_iOS8扩展:智能家居/第三方输入法开放

1苹果iOS8初步试水智能家居库克称今年是自AppStore建店以来变化最大的一次,在今年的WWDC开发者大会上我们看到苹果已经为开发者提供了更多更酷炫的开发权限,这让AppStore上的开发人员可以做出更酷的东西,而其中最让人振奋人心的还是智能家居、开放第三方输入法以及TouchID相应的开发权限开放。iOS8扩展:智能家居/第三方输入法开放(图片引自TheVerge)在今年市场上出现了...

weixin_39727706的博客 155

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

mac安装nodejs_Mac/iOS自带输入法导入第三方输入法词库

Mac/iOS自带输入法导入第三方输入法词库苹果的自带输入法简洁美观流畅,对各种软件的兼容性也是最好的,但是很明显的不足的就是词库没有第三方输入法强大。下面就介绍如何把第三方输入法个人词库导入到苹果自带输入法,原理都类似,支持百度输入法、搜狗输入法词库文件macOS、iOS上面输入法里面都有文本替换,这就可以让用户自定义词库,但是并没有导入的选项。但是发现在Mac上面选中文本项之后往桌面拖动是会在...

weixin_39992665的博客 2220

ios 输入法扩展_App Extension编程指南(iOS8/OS X v10.10):扩展类型--自定义键盘

通过使用第三方输入法替换系统原生输入法,用户可以实现一些特殊的功能。比如一个特别新颖的输入方式,或输入iOS原生输入法并不支持的语言。第三方输入法的基本功能很简单:通过点击、手势,或者其他输入事件,然后通过一个未分类的NSString对象在当前文本输入对象的插入点插入文字。卷首语请先确保您开发的第三方输入法真的要用于整个系统。若您只打算为您的应用程序提供一个完全定制的输入法或者只打算给系统输入法...

weixin_42297982的博客 1334

[iOS 禁用第三方输入法] 禁用第三方输入法+ExtensionPointIdentifier理解

自从iOS8开始,许多第三方输入法出现,但是旧项目里面没有对第三方输入法做过适配,倒是用户出现许多问题,网上有代码,在 Appdelegate.m中,添加- (BOOL)application:(UIApplication *)application shouldAllowExtensionPointIdentifier:(NSString *)extensionPointIdentifier {

iOSTianNan的博客 8419

nodejs 复制文件到用户路径下 mac_Mac/iOS自带输入法导入第三方输入法词库

Mac/iOS自带输入法导入第三方输入法词库苹果的自带输入法简洁美观流畅,对各种软件的兼容性也是最好的,但是很明显的不足的就是词库没有第三方输入法强大。下面就介绍如何把第三方输入法个人词库导入到苹果自带输入法,原理都类似,支持百度输入法、搜狗输入法词库文件macOS、iOS上面输入法里面都有文本替换,这就可以让用户自定义词库,但是并没有导入的选项。但是发现在Mac上面选中文本项之后往桌面拖动是会在...

weixin_29704001的博客 3229

ios 输入法扩展_iOS8新特性扩展(Extension)应用之四——自定义键盘控件

iOS8新特性扩展(Extension)应用之四——自定义键盘控件iOS8系统的开放第三方键盘,使得用户在输入法的选择上更加自主灵活,也更加贴近不同语言的输入风格。这篇博客,将介绍如何开发一个第三方的键盘控件。一、了解UIInputViewController类UIInputViewController是系统扩展支持键盘扩展的一个类,通过这个类,我们可以自定义一款我们自己的键盘提供给系统使用。首先...

weixin_39581739的博客 399

(判断第三方输入法)在系统数字键盘上添加“完成”按钮引发的问题思考

以前在系统自带的数字键盘上的左下角额外添加一个自定制的完成按钮,并且在键盘上添加了其他的控件样式。不过不久后,IOS8出来了,开始强大的支持第三方输入法。于是问题出来了。如果用户安装了第三方的输入法并设置使用。那么我们原先对于数字键盘上的控件定制将是一个很糟糕的麻烦。按照原先的数字键盘布局添加的“完成”等其他的按钮就会错位并且覆盖第三方输入法的键盘符。效果如下图:       解

jaybin的技术博客 3464

iOS 8最佳适配——被点赞的百度输入法

9月18日,网络红人王思聪于香港拿到最新款苹果手机iPhone6 Plus,第一时间对iOS8中第三方输入法进行体验,体验后发微博称:"百度手机输入法完美支持,新浪客户端10次闪退8次,搜狗输入法更是不支持,一时成为舆论焦点。"王思聪作为中国"最有钱的富二代",万达集团的公子哥,年仅26岁的他是互联网上的吐槽达人,这次对百度手机输入法的称赞十分少见。 前段时间,iOS8系统将开放第三

需要界面开发、IDE工具研发中文教程资料的小伙伴,记得私信我~ 1566
上一篇: Swift_方法func(在类、枚举、结构体中的声明和使用 mutating func初始化值可变)
下一篇: Swift_继承
Gz_Jason_chen
博客等级 码龄11年 49粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值