SZTextView 不能輸入中文解決方法

默認不能輸入中文。

修改屬性Secure Text Entry爲不勾選狀態即可。


SZTextView 源碼如下:

//

//  SZTextView.h

//  SZTextView

//

//  Created by glaszig on 14.03.13.

//  Copyright (c) 2013 glaszig. All rights reserved.

//


#import <UIKit/UIKit.h>


@interface SZTextView : UITextView


@property (copy, nonatomic) NSString *placeholder;

@property (copy, nonatomic) NSAttributedString *attributedPlaceholder;

@property (retain, nonatomic) UIColor *placeholderTextColor UI_APPEARANCE_SELECTOR;


@end


//

//  SZTextView.m

//  SZTextView

//

//  Created by glaszig on 14.03.13.

//  Copyright (c) 2013 glaszig. All rights reserved.

//


#import "SZTextView.h"


#define HAS_TEXT_CONTAINER [self respondsToSelector:@selector(textContainer)]

#define HAS_TEXT_CONTAINER_INSETS(x) [(x) respondsToSelector:@selector(textContainerInset)]


@interface SZTextView ()

@property (strong, nonatomic) UITextView *_placeholderTextView;

@end


static NSString * const kAttributedPlaceholderKey = @"attributedPlaceholder";

static NSString * const kPlaceholderKey = @"placeholder";

static NSString * const kFontKey = @"font";

static NSString * const kAttributedTextKey = @"attributedText";

static NSString * const kTextKey = @"text";

static NSString * const kExclusionPathsKey = @"exclusionPaths";

static NSString * const kLineFragmentPaddingKey = @"lineFragmentPadding";

static NSString * const kTextContainerInsetKey = @"textContainerInset";

static NSString * const kTextAlignmentKey = @"textAlignment";


@implementation SZTextView


- (instancetype)initWithCoder:(NSCoder *)coder

{

    self = [super initWithCoder:coder];

    if (self) {

        [self preparePlaceholder];

    }

    return self;

}


#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000

- (instancetype)initWithFrame:(CGRect)frame textContainer:(NSTextContainer *)textContainer

{

    self = [super initWithFrame:frame textContainer:textContainer];

    if (self) {

        [self preparePlaceholder];

    }

    return self;

}

#else

- (id)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self) {

        [self preparePlaceholder];

    }

    return self;

}

#endif


- (void)preparePlaceholder

{

    NSAssert(!self._placeholderTextView, @"placeholder has been prepared already: %@", self._placeholderTextView);

    // the label which displays the placeholder

    // needs to inherit some properties from its parent text view


    // account for standard UITextViewPadding


    CGRect frame = self.bounds;

    self._placeholderTextView = [[UITextView alloc] initWithFrame:frame];

    self._placeholderTextView.opaque = NO;

    self._placeholderTextView.backgroundColor = [UIColor clearColor];

    self._placeholderTextView.textColor = [UIColor lightGrayColor];

    self._placeholderTextView.textAlignment = self.textAlignment;

    self._placeholderTextView.editable = NO;

    self._placeholderTextView.scrollEnabled = NO;

    self._placeholderTextView.userInteractionEnabled = NO;

    self._placeholderTextView.font = self.font;

    self._placeholderTextView.isAccessibilityElement = NO;

    self._placeholderTextView.contentOffset = self.contentOffset;

    self._placeholderTextView.contentInset = self.contentInset;


    if ([self._placeholderTextView respondsToSelector:@selector(setSelectable:)]) {

        self._placeholderTextView.selectable = NO;

    }


    if (HAS_TEXT_CONTAINER) {

        self._placeholderTextView.textContainer.exclusionPaths = self.textContainer.exclusionPaths;

        self._placeholderTextView.textContainer.lineFragmentPadding = self.textContainer.lineFragmentPadding;

    }


    if (HAS_TEXT_CONTAINER_INSETS(self)) {

        self._placeholderTextView.textContainerInset = self.textContainerInset;

    }


    if (_attributedPlaceholder) {

        self._placeholderTextView.attributedText = _attributedPlaceholder;

    } else if (_placeholder) {

        self._placeholderTextView.text = _placeholder;

    }


    [self setPlaceholderVisibleForText:self.text];


    self.clipsToBounds = YES;


    // some observations

    NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];

    [defaultCenter addObserver:self selector:@selector(textDidChange:)

                          name:UITextViewTextDidChangeNotification object:self];


    [self addObserver:self forKeyPath:kAttributedPlaceholderKey

              options:NSKeyValueObservingOptionNew context:nil];

    [self addObserver:self forKeyPath:kPlaceholderKey

              options:NSKeyValueObservingOptionNew context:nil];

    [self addObserver:self forKeyPath:kFontKey

              options:NSKeyValueObservingOptionNew context:nil];

    [self addObserver:self forKeyPath:kAttributedTextKey

              options:NSKeyValueObservingOptionNew context:nil];

    [self addObserver:self forKeyPath:kTextKey

              options:NSKeyValueObservingOptionNew context:nil];

    [self addObserver:self forKeyPath:kTextAlignmentKey

              options:NSKeyValueObservingOptionNew context:nil];


    if (HAS_TEXT_CONTAINER) {

        [self.textContainer addObserver:self forKeyPath:kExclusionPathsKey

                                options:NSKeyValueObservingOptionNew context:nil];

        [self.textContainer addObserver:self forKeyPath:kLineFragmentPaddingKey

                                options:NSKeyValueObservingOptionNew context:nil];

    }


    if (HAS_TEXT_CONTAINER_INSETS(self)) {

        [self addObserver:self forKeyPath:kTextContainerInsetKey

                  options:NSKeyValueObservingOptionNew context:nil];

    }

}


- (void)setPlaceholder:(NSString *)placeholderText

{

    _placeholder = [placeholderText copy];

    _attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholderText];


    [self resizePlaceholderFrame];

}


- (void)setAttributedPlaceholder:(NSAttributedString *)attributedPlaceholderText

{

    _placeholder = attributedPlaceholderText.string;

    _attributedPlaceholder = [attributedPlaceholderText copy];


    [self resizePlaceholderFrame];

}


- (void)layoutSubviews

{

    [super layoutSubviews];

    [self resizePlaceholderFrame];

}


- (void)resizePlaceholderFrame

{

    CGRect frame = self._placeholderTextView.frame;

    frame.size = self.bounds.size;

    self._placeholderTextView.frame = frame;

}


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object

                        change:(NSDictionary *)change context:(void *)context

{

    if ([keyPath isEqualToString:kAttributedPlaceholderKey]) {

        self._placeholderTextView.attributedText = [change valueForKey:NSKeyValueChangeNewKey];

    }

    else if ([keyPath isEqualToString:kPlaceholderKey]) {

        self._placeholderTextView.text = [change valueForKey:NSKeyValueChangeNewKey];

    }

    else if ([keyPath isEqualToString:kFontKey]) {

        self._placeholderTextView.font = [change valueForKey:NSKeyValueChangeNewKey];

    }

    else if ([keyPath isEqualToString:kAttributedTextKey]) {

        NSAttributedString *newAttributedText = [change valueForKey:NSKeyValueChangeNewKey];

        [self setPlaceholderVisibleForText:newAttributedText.string];

    }

    else if ([keyPath isEqualToString:kTextKey]) {

        NSString *newText = [change valueForKey:NSKeyValueChangeNewKey];

        [self setPlaceholderVisibleForText:newText];

    }

    else if ([keyPath isEqualToString:kExclusionPathsKey]) {

        self._placeholderTextView.textContainer.exclusionPaths = [change objectForKey:NSKeyValueChangeNewKey];

        [self resizePlaceholderFrame];

    }

    else if ([keyPath isEqualToString:kLineFragmentPaddingKey]) {

        self._placeholderTextView.textContainer.lineFragmentPadding = [[change objectForKey:NSKeyValueChangeNewKey] floatValue];

        [self resizePlaceholderFrame];

    }

    else if ([keyPath isEqualToString:kTextContainerInsetKey]) {

        NSValue *value = [change objectForKey:NSKeyValueChangeNewKey];

        self._placeholderTextView.textContainerInset = value.UIEdgeInsetsValue;

    }

    else if ([keyPath isEqualToString:kTextAlignmentKey]) {

        NSNumber *alignment = [change objectForKey:NSKeyValueChangeNewKey];

        self._placeholderTextView.textAlignment = alignment.intValue;

    }

    else {

        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];

    }

}


- (void)setPlaceholderTextColor:(UIColor *)placeholderTextColor

{

    self._placeholderTextView.textColor = placeholderTextColor;

}


- (UIColor *)placeholderTextColor

{

    return self._placeholderTextView.textColor;

}


- (void)textDidChange:(NSNotification *)aNotification

{

    [self setPlaceholderVisibleForText:self.text];

}


- (BOOL)becomeFirstResponder

{

    [self setPlaceholderVisibleForText:self.text];


    return [super becomeFirstResponder];

}


- (void)setPlaceholderVisibleForText:(NSString *)text

{

    if (text.length < 1) {

        [self addSubview:self._placeholderTextView];

        [self sendSubviewToBack:self._placeholderTextView];

    } else {

        [self._placeholderTextView removeFromSuperview];

    }

}


- (void)dealloc

{

    [[NSNotificationCenter defaultCenter] removeObserver:self];

    [self removeObserver:self forKeyPath:kAttributedPlaceholderKey];

    [self removeObserver:self forKeyPath:kPlaceholderKey];

    [self removeObserver:self forKeyPath:kFontKey];

    [self removeObserver:self forKeyPath:kAttributedTextKey];

    [self removeObserver:self forKeyPath:kTextKey];

    [self removeObserver:self forKeyPath:kTextAlignmentKey];


    if (HAS_TEXT_CONTAINER) {

        [self.textContainer removeObserver:self forKeyPath:kExclusionPathsKey];

        [self.textContainer removeObserver:self forKeyPath:kLineFragmentPaddingKey];

    }


    if (HAS_TEXT_CONTAINER_INSETS(self)) {

        [self removeObserver:self forKeyPath:kTextContainerInsetKey];

    }

}


@end



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章