zoukankan      html  css  js  c++  java
  • iOS开发中UIView层次管理中sendSubviewToBack用法

    在iOS开发过程中,视图的层次是非常重要的,往往一不小心就会造成出乎意料的bug。通常体现在button不灵敏或拖拽失效等;

    Xcode6出来后,有个功能叫View UI Hierarchy,即UI检视器。它的位置在xcode中的

    它非常的方便我们观察UI的位置及视图的层次。

    在iOS中管理视图层次的二个重要方法就是

    //将view显示在最前

    - (void)bringSubviewToFront:(UIView *)view;

    例如:[self.view bringSubviewToFront:self.firstView];

    //将view显示在最后

    - (void)sendSubviewToBack:(UIView *)view;

    例如:[self.view sendSubviewToBack:self.firstView];

    在这里我将着重讲下sendSubviewToBack一个很妙的用法。

    常常在处理文本框输入内容时,通常是注册一个通知,然后将view向上顶,

    就像这样

        //注册键盘通知

        [[NSNotificationCenter defaultCenter] addObserver:self

                                                 selector:@selector(keyboardWillShow:)

                                                     name:UIKeyboardWillShowNotification

                                                   object:nil];

        [[NSNotificationCenter defaultCenter] addObserver:self

                                                 selector:@selector(keyboardWillHide:)

                                                     name:UIKeyboardWillHideNotification

                                                   object:nil];

    然后再将界面向上顶

    -(void) keyboardWillShow:(NSNotification *)note{

        // get keyboard size and loctaion

    CGRect keyboardBounds;

        [[note.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] getValue: &keyboardBounds];

        NSNumber *duration = [note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];

        NSNumber *curve = [note.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey];

        // Need to translate the bounds to account for rotation.

        keyboardBounds = [self.view convertRect:keyboardBounds toView:nil];

    // get a rect for the textView frame

        if ([self.contextView isFirstResponder]) {

            CGRect containerFrame = self.creatView.frame;

            containerFrame.origin.y = self.view.bounds.size.height - (keyboardBounds.size.height + containerFrame.size.height);

            containerFrame.origin.x = 21;

            containerFrame.size.width=278;

            // animations settings

            [UIView beginAnimations:nil context:NULL];

            [UIView setAnimationBeginsFromCurrentState:YES];

            [UIView setAnimationDuration:[duration doubleValue]];

            [UIView setAnimationCurve:[curve intValue]];

            // set views with new info

            self.creatView.frame = containerFrame;

            // commit animations

            [UIView commitAnimations];

        }

    }

    但这样做的话会有个不好的地方,那就是可能会将自定义的导航栏顶出界面外了,就像这样

    这样的话虽说键盘并没有挡住文本框的效果实现了,但界面体验不太好。那么该怎么办呢。

    其实我们分析原因可知,之所以导航栏向上顶了,因为其所属的层在整个view中

    - (BOOL)textViewShouldBeginEditing:(UITextView *)textView{

        if ([textView isKindOfClass:[self.secondview.descriptionTextView class]]) {

            [self.view sendSubviewToBack:self.secondview];

            [UIView animateWithDuration:0.35f animations:^{

                [self.secondview setFrame:CGRectMake(self.secondview.frame.origin.x, self.secondview.frame.origin.y - 216.0f, self.secondview.frame.size.width, self.secondview.frame.size.height)];

            } completion:^(BOOL finished) {

            }];

        }

        return YES;

    }

    调整后,可以看到,键盘弹出后,导航栏并没有消失

    至此,问题完美解决!

  • 相关阅读:
    Hihocoder 1275 扫地机器人 计算几何
    CodeForces 771C Bear and Tree Jumps 树形DP
    CodeForces 778D Parquet Re-laying 构造
    CodeForces 785E Anton and Permutation 分块
    CodeForces 785D Anton and School
    CodeForces 785C Anton and Fairy Tale 二分
    Hexo Next 接入 google AdSense 广告
    如何统计 Hexo 网站的访问地区和IP
    Design and Implementation of Global Path Planning System for Unmanned Surface Vehicle among Multiple Task Points
    通过ODBC接口访问人大金仓数据库
  • 原文地址:https://www.cnblogs.com/kw-ios/p/4182263.html
Copyright © 2011-2022 走看看