我正在开发一个消息应用程序,并希望iOS 8中的预测键盘能够识别正在撰写消息的用户正在回复上一个消息.
所以我希望能够将一个字符串提供给键盘,为它提供预测的上下文.因此,如果用户被问及一个可以解释为极性的问题(是/否),那么预测键盘应该是“是”不|也许
这是开发人员可以使用的吗?
请注意,我不是在说自定义键盘,只是给标准键盘提供了一些上下文,因为它是预测的.我也不关心实际定制快速类型的回复as in this question.我只是希望键盘知道它是什么打字.
解决方法
严格地将建议输入到默认键盘是不可能的.但是,如果您想为用户提供相同的体验,我将使用myTextView.autocorrectionType = UITextAutocorrectionTypeNo隐藏iOS建议栏;然后用我自己的自定义视图替换该视图,模仿建议视图直到.一旦用户键入字符或选择了一个选项,然后隐藏自定义建议视图并重新启用iOS建议栏.
我的子类UIInputView只是为了这个(透明度和转换是一点点,但一切都很好).
- #import <UIKit/UIKit.h>
- @protocol SuggestionViewDelegate <NSObject>
- @required
- - (void)suggestionSelected:(NSString *)suggestion;
- @end
- @interface SuggestionView : UIInputView
- - (instancetype)init;
- - (instancetype)initWithFrame:(CGRect)frame;
- /**
- * The list of suggestions being displayed.
- * The array contains 0-3 strings.
- *
- * @return Array of NSString's representing the current suggested strings
- */
- - (NSArray *)suggestions;
- /**
- * Add a suggestion to display in the view.
- * If there are already maxSuggestionCount suggestions,the added suggestion will push one of them out.
- * If there are already maxSuggestionCount suggestions and the input is 'nil' then the last suggestion will be removed.
- *
- * @param suggestion String to suggest to the user
- */
- - (void)addSuggestion:(NSString *)suggestion;
- /**
- * Removes the suggestion from the list of displayed suggestions.
- * If the string is not in the set then there is no change made.
- *
- * @param suggestion NSString to remove from the suggested strings
- */
- - (void)removeSuggestion:(NSString *)suggestion;
- /**
- * Takes in either NSArray or NSSet and replaces 'suggestions' with the input.
- * Only the first three arguments are recognized.
- * Objects should be strings. Undefined behavior otherwise.
- *
- * @param suggestions NSArray or NSSet with 0-3 NSStrings
- */
- - (void)setSuggestions:(NSObject *)suggestions;
- @property (weak) id <SuggestionViewDelegate> delegate;
- /**
- * The maximum number of suggestions allowed. Default is 3.
- */
- @property (nonatomic) NSInteger maxSuggestionCount;
- @end
- #import "SuggestionView.h"
- #define kScreenWidth [UIScreen mainScreen].bounds.size.width
- @implementation SuggestionView {
- NSMutableOrderedSet *_suggestions;
- NSMutableArray *_suggestionButtons;
- }
- - (instancetype)init {
- self = [self initWithFrame:CGRectMake(0.0f,0.0f,kScreenWidth,36.0f)];
- if (self) {
- }
- return self;
- }
- - (instancetype)initWithFrame:(CGRect)frame {
- self = [super initWithFrame:frame inputViewStyle:UIInputViewStyleKeyboard];
- if (self) {
- _suggestions = [[NSMutableOrderedSet alloc] initWithCapacity:3];
- self.maxSuggestionCount = 3;
- _suggestionButtons = [[NSMutableArray alloc] init];
- self.backgroundColor = [UIColor colorWithWhite:0.0f alpha:0.04f];
- }
- return self;
- }
- #pragma mark - Modifying Suggestions
- - (void)addSuggestion:(NSString *)suggestion {
- if (suggestion) {
- [_suggestions addObject:suggestion];
- }
- while (_suggestions.count > self.maxSuggestionCount) {
- [_suggestions removeObjectAtIndex:self.maxSuggestionCount];
- }
- }
- - (void)removeSuggestion:(NSString *)suggestion {
- [_suggestions removeObject:suggestion];
- }
- - (void)setSuggestions:(NSObject *)suggestions {
- if ([suggestions respondsToSelector:@selector(countByEnumeratingWithState:objects:count:)]) {
- [_suggestions removeAllObjects];
- for (NSString *suggestion in (NSArray *)suggestions) {
- if (_suggestions.count < self.maxSuggestionCount) {
- [_suggestions addObject:suggestion];
- } else {
- break;
- }
- }
- }
- }
- - (NSArray *)suggestions {
- NSMutableArray *suggestionsArray = [[NSMutableArray alloc] initWithCapacity:_suggestions.count];
- for (NSString *suggestion in _suggestions) {
- [suggestionsArray addObject:suggestion];
- }
- return suggestionsArray;
- }
- #pragma mark - Visual Layout of Suggestions
- - (void)layoutSubviews {
- [self layoutSuggestions];
- }
- - (void)layoutSuggestions {
- for (UIView *subview in _suggestionButtons) {
- [subview removeFromSuperview];
- }
- [_suggestionButtons removeAllObjects];
- for (int i = 0; i < _suggestions.count; i++) {
- NSString *suggestion = _suggestions[i];
- UIButton *suggestionButton = [[UIButton alloc] initWithFrame:CGRectMake(i * self.bounds.size.width/_suggestions.count,self.bounds.size.width/_suggestions.count,self.bounds.size.height)];
- [suggestionButton setTitle:suggestion forState:UIControlStateNormal];
- suggestionButton.titleLabel.adjustsFontSizeToFitWidth = YES;
- suggestionButton.titleLabel.textAlignment = NSTextAlignmentCenter;
- [suggestionButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
- [suggestionButton addTarget:self action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside];
- [self addSubview:suggestionButton];
- if (i > 0) {
- UIView *whiteLine = [[UIView alloc] initWithFrame:CGRectMake(0.0f,0.5f,self.bounds.size.height)];
- whiteLine.backgroundColor = [UIColor whiteColor];
- [suggestionButton addSubview:whiteLine];
- }
- [_suggestionButtons addObject:suggestionButton];
- }
- }
- #pragma mark - Selecting a Suggestion
- - (void)buttonTouched:(UIButton *)button {
- NSTimeInterval animationDuration = 0.09f;
- [UIView animateWithDuration:animationDuration animations:^{
- [button setBackgroundColor:[UIColor whiteColor]];
- if ([self.delegate respondsToSelector:@selector(suggestionSelected:)]) {
- [self performSelector:@selector(suggestionSelected:) withObject:button.currentTitle afterDelay:animationDuration * 0.9f];
- }
- [button performSelector:@selector(setBackgroundColor:) withObject:[UIColor clearColor] afterDelay:animationDuration];
- }];
- }
- - (void)suggestionSelected:(NSString *)suggestion {
- if ([self.delegate respondsToSelector:@selector(suggestionSelected:)]) {
- [self.delegate suggestionSelected:suggestion];
- }
- }
- @end
要将其实现为您已经子类化的UITextField或UITextView,请导入SuggestionView并实现SuggestionViewDelegate.然后,在UITextFieldDelegate(或UITextViewDelegate)方法中,添加:
- - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
- if ([textField isEqual:self.messageTextField]) {
- if (self.suggestionView.suggestions.count > 0 && textField.text.length == 0) {
- textField.inputAccessoryView = self.suggestionView;
- textField.autocorrectionType = UITextAutocorrectionTypeNo;
- [textField reloadInputViews];
- }
- }
- return YES;
- }
- - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
- if ([textField isEqual:self.messageTextField]) {
- if (string.length > 0) {
- [self removeSuggestionView];
- }
- }
- return YES;
- }
- - (void)removeSuggestionView {
- self.messageTextField.inputAccessoryView = nil;
- [self.messageTextField setInputAccessoryView:nil];
- self.messageTextField.autocorrectionType = UITextAutocorrectionTypeYes;
- [self.messageTextField reloadInputViews];
- [self.messageTextField performSelector:@selector(resignFirstResponder) withObject:self afterDelay:0.0f];
- [self.messageTextField performSelector:@selector(becomeFirstResponder) withObject:self afterDelay:0.0f];
- }
然后,实现SuggestionViewDelegate:
- - (void)suggestionSelected:(NSString *)suggestion {
- [self.messageTextField setText:[NSString stringWithFormat:@"%@%@ ",self.messageTextField.text,suggestion]];
- [self removeSuggestionView];
- }