博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS博客项目搭建-15-发微博-自定义键盘上的Toolbar
阅读量:2384 次
发布时间:2019-05-10

本文共 3733 字,大约阅读时间需要 12 分钟。

自定义发布微博界面的工具栏,下图红框中的Toolbar。

toolbar

工具条是一个整体,可以封装一个类文件,来进行处理相关的操作。

##一、先创建一个工具条view继承UIView

IWComposeToolbar.m

图1

然后在发微博控制器IWComposeViewController.m中引用该工具toolbar文件

#import "IWComposeToolbar.h"

IWComposeViewController.m创建toolbar对象,并设置位置大小

- (void)viewDidLoad{    [super viewDidLoad];        // 设置导航栏属性    [self setupNavBar];        // 添加textView    [self setupTextView];        // 添加toolbar ****===***    [self setupToolbar];}/** *  添加Toolbar */-(void)setupToolbar{    IWComposeToolbar *toolbar = [[IWComposeToolbar alloc] init];        // 设置frame    CGFloat toolbarH = 44;    CGFloat toolbarW = self.view.frame.size.width;  // 宽度为view的宽度    CGFloat toolbarX = 0;   // 位置,在最左边    CGFloat toolbarY = self.view.frame.size.height - toolbarH; // 无键盘时的toolbar高度    toolbar.frame = CGRectMake(toolbarX, toolbarY, toolbarW, toolbarH);        NSLog(@"toolbar...");        // toolbar的父控件是textview还是控制器?经过分析新浪微博的toolbar,当键盘消失时,toolbar永远在view的最底部    // 所以,我们确定其父控件为控制器    [self.view addSubview:toolbar];    }

效果图:

图片说明

##二、接下来监听键盘的弹出和消失,来确定toolbar的位置 该如何做呢?是算键盘的高度然后将toolbar置于键盘上边还是有其他方法呢?这里我们可以考虑用更简单的方法,即transform来处理,以后凡是牵扯到一个控件要向上移动多少又要回到原来的位置,应该用transform,要回到原来的位置清除transform即可。

在setupTextView方法中添加监听键盘出现、退出的通知。

/** *添加textView */- (void)setupTextView{    // 1.添加    IWTextView *textView = [[IWTextView alloc] init];    textView.font = [UIFont systemFontOfSize:15];        // 垂直方向上永远可以拖拽    textView.alwaysBounceHorizontal = YES;    textView.delegate = self;        textView.frame = self.view.bounds;    textView.placeholder = @"分享新鲜事...分享新鲜事...分享新鲜事...分享新鲜事...分享新鲜事...";            [self.view addSubview:textView];        // 让textView成为第一响应者,弹出键盘    // [textView becomeFirstResponder];    self.textView = textView;        // 2.监听textView文字改变的通知    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:textView];        // 3.监听键盘,当键盘frame改变时(键盘的Y值会变化,键盘的显示、隐藏),做出相应的操作===*****=======    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];}/** * 键盘出现的时候调用 *@param note */-(void)keyboardWillShow:(NSNotification *)note{    IWLog(@"keyboardWillShow---%@", note.userInfo);}/** * 键盘即将退出的时候调用 *@param note */-(void)keyboardWillHide:(NSNotification *)note{    IWLog(@"keyboardWillHide---%@", note.userInfo);}

打印数据,可以看到键盘的所有属性信息都在通知的字典里,包括frame变化。

图片说明

将toolbar设置为属性,然后赋值给其,方便在后边的方法里直接调用toolbar控件。

@property (nonatomic, weak)IWComposeToolbar *toolbar;

键盘出现时,根据通知监听的属性,获取键盘的frame,然后根据toolbar的transform,对其位置进行改变。

/** * 键盘出现的时候调用 *@param note */-(void)keyboardWillShow:(NSNotification *)note{    IWLog(@"keyboardWillShow---%@", note.userInfo);        // 1.获取键盘的frame,从字典里取出来的为对象,还需要转CGRectValue    CGRect keyboardF = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];        // 2.取出键盘弹出的时间    CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];        // 3.执行动画    [UIView animateWithDuration:duration animations:^{        self.toolbar.transform = CGAffineTransformMakeTranslation(0, -keyboardF.size.height);            }];    }

效果图:

输入图片说明

###整个流程(键盘出现和消失,toolbar的位置变化):

/** * 键盘即将退出的时候调用 *@param note */-(void)keyboardWillHide:(NSNotification *)note{        // 1.取出键盘弹出的时间    CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];        // 2.执行动画    [UIView animateWithDuration:duration animations:^{        self.toolbar.transform = CGAffineTransformIdentity;            }];}

图片说明

通过效果图可以看到,toolbar已经在键盘的上边了 ^_^,凌晨1点半了,明天是周一,也该睡觉了。。。

转载于:https://my.oschina.net/corwien/blog/675252

你可能感兴趣的文章
实现自定义对话框程序快捷键的两种方法
查看>>
如何对抗微软霸权,google给我们上了一课
查看>>
未能将基于用户的Visual C++项目设置保存到user文件错误的解决
查看>>
获取windows版本信息的做法
查看>>
忆父亲
查看>>
png库结合zlib库使用出现的一个链接问题的解决
查看>>
STL数组和com数组相互转换的做法
查看>>
开发平台软件中关于第三方库管理的一些思考
查看>>
svn创建分支的做法
查看>>
“当前不会命中断点。源代码与原始版本不同”的问题的有效解决办法
查看>>
对面向对象和面向过程的一些新理解
查看>>
软件开发中的资源管理
查看>>
有关博客的一些断想
查看>>
Windows Server2008上安装VS2008出错及解决办法
查看>>
打开word2010每次都要配置进度的解决办法
查看>>
略论并行处理系统的日志设计
查看>>
开发人员应具备的产品设计意识
查看>>
MSComDlg.CommonDialog服务器不能创建对象错误的解决
查看>>
ArcGIS二次开发之读取遥感图像像素值的做法
查看>>
netcdf源码在windows上的编译
查看>>