本文主要讲解在Xamarin.Forms(Xamarin.iOS)开发中,键盘自适应输入框的高度,调整页面位置的实现过程,本篇文章将介绍多种方案去实现。
首先我们介绍一下键盘自适应的场景,我们在实际开发中通常会遇到输入框输入信息的状况,在iOS中我们当我们的键盘挡住我们的输入框的时候,这种对于App的用户体验和操作体验来说都不符合一个正式App的风格,现在许多新闻类App通常会将评论输入框放置在页面最底部,当我们编辑评论的时候通常我们需要去调整这个页面的UI去达到适应键盘高度的情况,而这对于源生iOS开发来说,通过Notification可以很轻易的做到,但是这个方法Xamarin中应该怎么具体实现呢?
在此我为大家介绍两种方式去实现:
1.使用iOS的Notification(通知机制)去实现
2.使用第三方类库IQKeyboardManager去实现
Notification实现
首先给大家简单介绍下Notification是个什么东西,首先Notification是iOS系统提供的一个同步消息通知机制,类似于Android的广播。观察者只要向消息中心注册, 即可接受其他对象发送来的消息,消息发送者和消息接受者两者可以互相一无所知,完全解耦。
也就是说我们可以利用Notification机制去观察键盘的变化从而得到消息中心发送过来的消息以实现键盘自适应的功能,那么我们首先看看Notification在OC中是如何监测键盘的呢?
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
#pragma -mark -keyboard notificatin
- (void)keyboardWillShow:(NSNotification *)notification {
NSDictionary *info = [notification userInfo];
// keyboardHeight 为键盘高度
CGSize keyboardSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
[self animateViewWithKeyboardHeight:keyboardSize.height];
}
- (void)keyboardWillHide:(NSNotification *)notification {
[self animateViewWithKeyboardHeight:0.0];
}
我们可以从上边看到实现键盘自适应的原理就是通过监测键盘的显示和隐藏状态去改变当前View的位置达到自适应功能,但是这个代码在Xamarin中我们应该怎么去实现呢?Xamarin.Forms虽然也有MessagingCenter,但是我们要怎么去监测键盘的状态呢?
这里我直接先给大家展示代码:
private NSObject keyBoardWillShow;
private NSObject keyBoardWillHide;
//移动的Height
private nfloat scrollAmout;
//动画持续时间
private double animDuration;
//动画曲线
private UIViewAnimationCurve animCurve;
public override void ViewWillAppear(bool animated)
{
base.ViewWillAppear(animated);
keyBoardWillShow = UIKeyboard.Notifications.ObserveWillShow(KeyboardWillShow);
keyBoardWillHide = UIKeyboard.Notifications.ObserveWillHide(KeyboardWillHide);
}
void KeyboardWillShow(object sender, UIKeyboardEventArgs args)
{
animDuration = args.AnimationDuration;
animCurve = args.AnimationCurve;
var r = UIKeyboard.FrameBeginFromNotification(args.Notification);
scrollAmout = r.Height;
ScrollTheView(true);
}
void KeyboardWillHide(object sender, UIKeyboardEventArgs args)
{
keyboardShowing = false;
animDuration = args.AnimationDuration;
animCurve = args.AnimationCurve;
var r = UIKeyboard.FrameBeginFromNotification(args.Notification);
scrollAmout = r.Height;
ScrollTheView(false);
}
private void ScrollTheView(bool scale)
{
UIView.BeginAnimations(string.Empty, IntPtr.Zero);
UIView.SetAnimationDuration(animDuration);
UIView.SetAnimationCurve(animCurve);
var frame = View.Frame;
if (scale)
frame.Y -= scrollAmout;
else
frame.Y += scrollAmout;
View.Frame = frame;
UIView.CommitAnimations();
}
这样我们就能吧OC中的键盘监测使用到我们的Forms项目中了,不过这里我们需要注意的一点是:我们在ViewDidLoad中进行键盘的监听注册后,我们必须在当前页面消失时候取消监听,不然程序会报异常的。这里我们需要在ViewWillDisappear中取消监听。
public override void ViewWillDisappear(bool animated)
{
base.ViewWillDisappear(animated);
keyBoardWillShow.Dispose();
keyBoardWillHide.Dispose();
}
这样我们就可以在Xamarin.iOS或者Xamarin.Forms(Renderer)中使用这个功能了。
IQKeyboardManager
大家在看了上边一堆代码和原理的讲解之后,是不发现要用的话还得自己写Render或者添加监测和取消,有人问有没有现成的东西可以直接拿来用的,当然许多技术大牛们早就为我们提供了这个遍历,我也给大家介绍一个使用及其广泛,而且使用及其简单的类库。
首先我们看看这个类库需要添加的代码:
IQKeyboardManager *manager = [IQKeyboardManager sharedManager];
manager.enable = YES;
manager.shouldResignOnTouchOutside =YES;
[[IQKeyboardManager sharedManager] setToolbarDoneBarButtonItemText:@"确定"];
// 这个类库同样提供设置键盘的returnKey的关键字 ;可以点击键盘上的next键,自动跳转到下一个输入框,最后一个输入框点击完成,自动收起键盘等
看到这里你是不是一下子觉得这个库好啊,四行代码就搞定了,而且整个App都可以使用,是不是一下子就想用这个类库了?其实就我个人而言,两种方式我在具体项目中尝试过,类库使用简单便捷,Render可扩展性高,但是具体使用哪个好,其实主要看你喜欢用现成的还是自己的,对于这种自己完全可以实现的我推荐自己写代码就好,毕竟不像那些技术含量特别高的类库一样,自己没法写出那么完美的逻辑,那种库咱们想写都不一定能写的那么完善。所以给大家一点推荐,多写一点代码,多理解一点原理,多得到一份体会。
最近很久没来简书发表心得了,其实文章题目一直在列表里,只是最近换了工作实在太忙没有机会安静的写完,希望以后能继续捡起简书里的这支笔,让Xamarin变得更热门。