标签:
最近做的项目中,有一个类似微博中的评论转发功能,屏幕底端有一个输入框用textView来做,当textView成为第一响应者的时候它的Y值随着键盘高度的改变而改变,保证textView紧贴着键盘,但又不会被键盘挡住。
下面是我实现的方法:(利用通知)
| 1 2 3 4 5 6 7 8 9 10 11 12 | // 键盘通知    // 键盘的frame发生改变时发出的通知(位置和尺寸)    //    UIKeyboardWillChangeFrameNotification    //    UIKeyboardDidChangeFrameNotification    // 键盘显示时发出的通知    //    UIKeyboardWillShowNotification    //    UIKeyboardDidShowNotification    // 键盘隐藏时发出的通知    //    UIKeyboardWillHideNotification    //    UIKeyboardDidHideNotification        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];//在这里注册通知 | 
下面是监听通知:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #pragma mark - 监听方法/** * 键盘的frame发生改变时调用(显示、隐藏等) */- (void)keyboardWillChangeFrame:(NSNotification *)notification{    //    if (self.picking) return;    /**     notification.userInfo = @{     // 键盘弹出\隐藏后的frame     UIKeyboardFrameEndUserInfoKey = NSRect: {{0, 352}, {320, 216}},     // 键盘弹出\隐藏所耗费的时间     UIKeyboardAnimationDurationUserInfoKey = 0.25,     // 键盘弹出\隐藏动画的执行节奏(先快后慢,匀速)     UIKeyboardAnimationCurveUserInfoKey = 7     }     */        NSDictionary *userInfo = notification.userInfo;        // 动画的持续时间    doubleduration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];        // 键盘的frame    CGRect keyboardF = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];        // 执行动画    [UIView animateWithDuration:duration animations:^{        // 工具条的Y值 == 键盘的Y值 - 工具条的高度        if(keyboardF.origin.y > self.view.height) { // 键盘的Y值已经远远超过了控制器view的高度            self.toolbar.y = self.view.height - self.toolbar.height;//这里的<span style="">self.toolbar就是我的输入框。</span>        }else{            self.toolbar.y = keyboardF.origin.y - self.toolbar.height;        }    }];} | 
当然,这里我为UIView写了一个类别,实现如下:
.h文件中声明
| 1 2 3 4 5 6 7 8 9 10 | @interfaceUIView (Extension)@property(nonatomic, assign) CGFloat x;@property(nonatomic, assign) CGFloat y;@property(nonatomic, assign) CGFloat width;@property(nonatomic, assign) CGFloat height;@property(nonatomic, assign) CGFloat centerX;@property(nonatomic, assign) CGFloat centerY;@property(nonatomic, assign) CGSize size;@property(nonatomic, assign) CGPoint origin;@end | 
.m文件中实现(重写setter 和 getter)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | @implementationUIView (Extension)- (void)setX:(CGFloat)x{    CGRect frame = self.frame;    frame.origin.x = x;    self.frame = frame;}- (void)setY:(CGFloat)y{    CGRect frame = self.frame;    frame.origin.y = y;    self.frame = frame;}- (CGFloat)x{    returnself.frame.origin.x;}- (CGFloat)y{    returnself.frame.origin.y;}- (void)setCenterX:(CGFloat)centerX{    CGPoint center = self.center;    center.x = centerX;    self.center = center;}- (CGFloat)centerX{    returnself.center.x;}- (void)setCenterY:(CGFloat)centerY{    CGPoint center = self.center;    center.y = centerY;    self.center = center;}- (CGFloat)centerY{    returnself.center.y;}- (void)setWidth:(CGFloat)width{    CGRect frame = self.frame;    frame.size.width = width;    self.frame = frame;}- (void)setHeight:(CGFloat)height{    CGRect frame = self.frame;    frame.size.height = height;    self.frame = frame;}- (CGFloat)height{    returnself.frame.size.height;}- (CGFloat)width{    returnself.frame.size.width;}- (void)setSize:(CGSize)size{    CGRect frame = self.frame;    frame.size = size;    self.frame = frame;}- (CGSize)size{    returnself.frame.size;}- (void)setOrigin:(CGPoint)origin{    CGRect frame = self.frame;    frame.origin = origin;    self.frame = frame;}- (CGPoint)origin{    returnself.frame.origin;}@end | 
有需要的朋友可以直接用
标签:
原文地址:http://www.cnblogs.com/liuqixu/p/4683200.html