swift3 实现键盘弹出视图上移

第一种方法(便捷方法):

1)在一个原生UITableView或者是继承了该UITableView之后的的view上添加一个textField,点击textFIeld会自动上移视图

系统原生的UITableViewController 是有一个功能:点击其中的textField如果上弹的键盘视图遮盖住了textField那么整个UITableView会有一个上移的效果,直到键盘视图不会遮盖住textField。

2)滑动tableView下移键盘视图

i.利用代码设置滑动tableView下移键盘

  1. tableView.keyboardDismissMode = .onDrag // tableView拖动,加盘下移       
  2. tableView.keyboardDismissMode =  .interactive // 向下拖动键盘视图键盘下移
ii.利用storyBoard设置



第二种方法(手写通知):

第一步:在你要实现这个功能的视图控制器中的viewDidload()中添加一个要监听的通知(这里为键盘上弹通知)

func addObserver(_ observer: Any, selector aSelector: Selector, name aName: NSNotification.Name?, object anObject: Any?)
在这个方法中添加通知
NotificationCenter.default.addObserver(self, selector: #selector(self.kbFrameChanged(_:)), name: .UIKeyboardWillChangeFrame, object: nil)
需要禁停通知的对象是本身(self)  , 收到通知之后要执行的函数是   kbFrameChanged(_:)    要被监听的通知的名称是  .UIKeyboardWillChangeFrame   传递的参数是  nil (不存在)


第二步:收到通知后需要调用的方法

func kbFrameChanged(_ notification : Notification){
        let info = notification.userInfo
        let kbRect = (info?[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
        let offsetY = kbRect.origin.y - UIScreen.main.bounds.height
        UIView.animate(withDuration: 0.3) { 
            self.view.transform = CGAffineTransform(translationX: 0, y: offsetY)
        }
    }

首先获取到通知的信息(是一个字典)

然后利用键取出其中有关键盘Frame的信息

之后由于需要让键盘弹出后整个视图上移,而上移的Y的偏移应该是负值所以要用  y-屏幕高度

最后利用动画展示随着键盘上移,视图上移的过程


以下是 notification.userInfo 中所有的内容

[AnyHashable("UIKeyboardCenterBeginUserInfoKey"): NSPoint: {187.5, 667},
 AnyHashable("UIKeyboardIsLocalUserInfoKey"): 1, 
AnyHashable("UIKeyboardCenterEndUserInfoKey"): NSPoint: {187.5, 667}, 
AnyHashable("UIKeyboardBoundsUserInfoKey"): NSRect: {{0, 0}, {375, 0}},
 AnyHashable("UIKeyboardFrameEndUserInfoKey"): NSRect: {{0, 667}, {375, 0}},
 AnyHashable("UIKeyboardAnimationCurveUserInfoKey"): 7,
 AnyHashable("UIKeyboardFrameBeginUserInfoKey"): NSRect: {{0, 667}, {375, 0}}, 
AnyHashable("UIKeyboardAnimationDurationUserInfoKey"): 0.25]
[AnyHashable("UIKeyboardCenterBeginUserInfoKey"): NSPoint: {187.5, 667},
 AnyHashable("UIKeyboardIsLocalUserInfoKey"): 1, 
AnyHashable("UIKeyboardCenterEndUserInfoKey"): NSPoint: {187.5, 532.5},
 AnyHashable("UIKeyboardBoundsUserInfoKey"): NSRect: {{0, 0}, {375, 269}},
 AnyHashable("UIKeyboardFrameEndUserInfoKey"): NSRect: {{0, 398}, {375, 269}}, 
AnyHashable("UIKeyboardAnimationCurveUserInfoKey"): 7,
 AnyHashable("UIKeyboardFrameBeginUserInfoKey"): NSRect: {{0, 667}, {375, 0}},
 AnyHashable("UIKeyboardAnimationDurationUserInfoKey"): 0]




  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在iOS的开发中,使用Swift可以实现底部视图。以下是一个简单的实现方式: 首先,需要创建一个底部视图的ViewController。可以在Storyboard中创建一个新的ViewController,并设置其底部约束为屏幕底部,高度为底部视图的高度。可以在该ViewController中添加需要显示的内容,比如按钮、标签等。 然后,在需要底部视图的地方,可以通过 present 方法来显示这个ViewController。可以在当前的ViewController中添加一个按钮,当点击该按钮时,调用如下代码来显示底部视图: ```swift // 创建底部视图的ViewController let bottomViewController = storyboard?.instantiateViewController(withIdentifier: "BottomViewController") as! BottomViewController // 设置底部视图的 ModalPresentationStyle 为 .overCurrentContext,使得视图会覆盖当前视图 bottomViewController.modalPresentationStyle = .overCurrentContext // 设置底部视图的 TransitioningDelegate;通过实现相关代理方法来自定义视图的动画效果 bottomViewController.transitioningDelegate = self // 底部视图 present(bottomViewController, animated: true, completion: nil) ``` 在当前ViewController中,需要增加一个扩展来实现底部视图的自定义动画: ```swift extension ViewController: UIViewControllerTransitioningDelegate { // 返回自定义的动画控制器对象 func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { return BottomViewAnimator(isPresenting: true) } // 返回自定义的动画控制器对象 func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { return BottomViewAnimator(isPresenting: false) } } ``` 在自定义动画控制器中,可以实现底部视图的动画效果。可以通过使用 UIView 的动画方法来实现、透明度等动画效果。 最后,需要创建一个自定义的 Animator 类,实现 UIViewControllerAnimatedTransitioning 协议的相关代理方法来控制动画的展示和隐藏。 通过上述步骤,即可完成iOS底部视图实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值