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;

    }

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

    至此,问题完美解决!

  • 相关阅读:
    Struts2拦截器
    Struts2 数据封装与值栈
    Struts2的环境搭配
    自学spring AOP
    小白学Maven第二篇配置Ecilpse
    小白学Maven第一篇配置
    web项目jsp出现The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path错误
    软件测试复习(二)
    软件测试复习(一)
    白盒测试概述
  • 原文地址:https://www.cnblogs.com/kw-ios/p/4182263.html
Copyright © 2011-2022 走看看