iOS 随键盘出现和消失的输入框

2021-12-18  本文已影响0人  東玖零

用了很多年的代码,突然发现这个输入框一出现就消失了。

#import "BaseView.h"
@interface InputView : BaseView<UITextFieldDelegate>

@property (nonatomic,strong) UITextField *field;
@property (nonatomic,strong) UIView *contentView;
@property (nonatomic,assign) CGFloat keyboardh;

- (void)show;

@end

#import "InputView.h"

@implementation InputView

+ (instancetype)viewSelect:(bselect )select; {
    CGRect frame = CGRectMake(0, 0, k_screen_width, k_screen_height);
    InputView *v = [[InputView alloc] initWithFrame:frame];
    [v setSelect:select];
    return v;
}

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        
        self.isTouchEndEdit = YES;
        
        self.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5];
        
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willShow:) name:UIKeyboardWillShowNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideShow:) name:UIKeyboardWillHideNotification object:nil];
        
        UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, self.height - 50, self.width, 50)];
        view.backgroundColor = [UIColor whiteColor];
        [self addSubview:view];
        self.contentView = view;
        
        UITextField *field = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, view.width - 20, 30)];
        field.backgroundColor = kGrayColorA;
        field.placeholder = @"请输入";
        field.delegate = self;
        field.returnKeyType = UIReturnKeyDone;
        field.layer.cornerRadius = 5;
        field.layer.borderWidth = 0.5;
        field.font = [UIFont systemFontOfSize:14];
        field.layer.borderColor = [[UIColor grayColor] colorWithAlphaComponent:0.5].CGColor;
        [field setAutocorrectionType:UITextAutocorrectionTypeNo]; // 联想、校正
        [field setAutocapitalizationType:UITextAutocapitalizationTypeNone];  // 首字母大写
        [view addSubview:field];
        self.field = field;
    }
    return self;
}

- (void)show {
    [self.field becomeFirstResponder];
}

- (void)willShow:(NSNotification *)note {
    NSDictionary *userInfo = [note userInfo];
    CGRect keyBoardRect = [[userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    self.keyboardh = keyBoardRect.size.height;
    NSValue *curveValue = [userInfo valueForKey:UIKeyboardAnimationCurveUserInfoKey];
    NSValue *durationValue = [userInfo valueForKey:UIKeyboardAnimationDurationUserInfoKey];
    NSUInteger curve = 0; // 动画曲线
    double duration = 0.0f; // 动画时间
    [curveValue getValue:&curve];
    [durationValue getValue:&duration];
    [UIView beginAnimations:@"keyboardShow"context:NULL];
    [UIView setAnimationDuration:duration];
    [UIView setAnimationCurve:(UIViewAnimationCurve)curve];
    self.contentView.transform = CGAffineTransformMakeTranslation(0, - self.keyboardh);
    [UIView commitAnimations];
}

- (void)hideShow:(NSNotification *)note {
    NSDictionary *userInfo = [note userInfo];
    NSValue *curveValue = [userInfo valueForKey:UIKeyboardAnimationCurveUserInfoKey];
    NSValue *durationValue = [userInfo valueForKey:UIKeyboardAnimationDurationUserInfoKey];
    NSUInteger curve = 0;
    double duration = 0.0f;
    [curveValue getValue:&curve];
    [durationValue getValue:&duration];
    [UIView beginAnimations:@"keyboardHide"context:NULL];
    [UIView setAnimationDuration:duration];
    [UIView setAnimationCurve:(UIViewAnimationCurve)curve];
    self.contentView.transform = CGAffineTransformIdentity;
    [UIView commitAnimations];
    [self performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:duration];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    if (self.select && self.field.text.length > 0) {
        DLog(@"--- %@",self.field.text);
        self.select(self.field.text);
    }
    [self.field resignFirstResponder];
    return NO;
}

- (void)endEditAction {
    [self.field resignFirstResponder];
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

@end

最终给输入框加一行代码即可解决。
[field setInputAccessoryView:[[UIView alloc] initWithFrame:CGRectZero]];

上一篇下一篇

猜你喜欢

热点阅读