【问题标题】:Customise the quicktype suggestions in iOS Keyboard自定义 iOS 键盘中的快速输入建议
【发布时间】:2015-04-03 14:49:25
【问题描述】:

当键盘在 uitextview 中打开时,我希望获得快速输入建议,以便将我自己的某些应用程序级别所需的短语作为建议。

例如,如果用户键入“全部”- 在 quicktype 建议中我想显示“一切都很好”或“一切都如预期”。

我可以自定义快速输入建议文本吗?

如果没有,还有什么其他方法可以在键盘打开时显示此建议。

【问题讨论】:

    标签: ios ios8 uitextview uitextviewdelegate


    【解决方案1】:

    由于没有(已知的)更改快速输入建议的方法,我将 UIInputView 子类化以允许将自定义建议作为输入附件视图(透明度和过渡有点偏离,但其他一切正常漂亮 em> 好吧)。

    注意:如果您的 UITextField 或 UITextView 上已有输入附件视图,则此方法不起作用。

    #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, 0.0f, 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.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
    

    要将其实现到您已经子类化的UITextFieldUITextView,请导入 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];
    }
    

    虽然这不是一个完美的解决方案,但它确实创造了预期的效果。

    【讨论】:

    • 多么精彩的答案!这很有帮助!太感谢了。这绝对值得更多的赞成......
    猜你喜欢
    • 2016-11-13
    • 1970-01-01
    • 2018-02-19
    • 2015-11-02
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多