iOS - 移动视图时界面元素重叠

Posted

技术标签:

【中文标题】iOS - 移动视图时界面元素重叠【英文标题】:iOS - Interface elements overlapping when move the view 【发布时间】:2012-05-08 21:39:04 【问题描述】:

我的应用程序有以下界面布局:

当我点击一个文本字段时(如果你点击添加标签,则会添加一个新的文本字段)我让我的视图向上滚动以免被键盘挡住,这样用户就可以正确地看到他正在输入的内容,但是以下内容当我这样做时会发生:

这是我用来滚动的代码:

- (void)keyboardWillShow:(NSNotification *)notification 
  if (self.keyboardIsShown) 
    return;
  

  NSValue *keyboardBoundsValue = [[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey];
  CGSize keyboardSize = [keyboardBoundsValue CGRectValue].size;

  NSTimeInterval animationDuration = 0.3;

  CGRect frame = self.view.frame;

  frame.origin.y -= keyboardSize.height - 94 + self.firstResponder.superview.superview.frame.origin.y;
  frame.size.height += keyboardSize.height - 94 + self.firstResponder.superview.superview.frame.origin.y;

  [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
  [UIView setAnimationBeginsFromCurrentState:YES];
  [UIView setAnimationDuration:animationDuration];
  self.view.frame = frame;
  [UIView commitAnimations];

  self.keyboardIsShown = YES;


- (void)keyboardWillHide:(NSNotification *)notification 
  NSValue *keyboardBoundsValue = [[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey];
  CGSize keyboardSize = [keyboardBoundsValue CGRectValue].size;

  NSTimeInterval animationDuration = 0.3;

  CGRect frame = self.view.frame;

  frame.origin.y += keyboardSize.height - 94 + self.firstResponder.superview.superview.frame.origin.y;
  frame.size.height -= keyboardSize.height - 94 + self.firstResponder.superview.superview.frame.origin.y;

  [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
  [UIView setAnimationBeginsFromCurrentState:YES];
  [UIView setAnimationDuration:animationDuration];
  self.view.frame = frame;
  [UIView commitAnimations];

  self.keyboardIsShown = NO;

知道如何使视图元素显示在导航栏后面或消失或其他可以正常工作的解决方法吗?

【问题讨论】:

【参考方案1】:

实现您想要的快速方法是将导航栏置于视图树中的“内容”视图下方。这样导航栏将保持在顶部。如果您动态添加内容。确保将它们添加为导航栏后面的视图的子视图。

// 编辑

按照 cmets 中的建议:

self.view.clipsToBounds = YES;
CGRect frame = self.yourWrappingView.frame;
NSUInteger distanceToMove = 200;
self.yourWrappingView.frame = CGRectMake(frame.origin.x - distanceToMove, frame.origin.y, frame.size.width, frame.size.height);

这应该对你有用:)

【讨论】:

除了添加标签中的额外表格视图单元格之外,它都是在情节提要中创建的。 因此,将您移动的内容包装在视图控制器主视图内的视图中。问题是,您正在移动视图控制器的主视图,您不应该这样做。 好的,我该怎么做?有像你说的那样包含所有内容的子视图吗? 所以你应该有一个包裹视图的属性,将viewController的主视图的clipsToBounds属性设置为YES,然后向上移动包裹视图。 8vius 我编辑了我的答案以包含我建议你做的代码示例。【参考方案2】:

您可能没有使用真正的UINavigationController。但你应该。所以你不会有这些问题和正确的调整大小行为。但是要在您当前的架构中解决它:

确保导航栏是 nib 文件/情节提要中最顶部的对象 为您的 UINavigationBar 添加一个 IBOutlet,如果您动态插入新视图,请使用 [self insertSubview: newView belowSubview: navigationBarOutlet];

【讨论】:

我的视图嵌入在导航控制器中,我使用的是 ios 5.1。并且只有表格视图的单元格是动态插入的。

以上是关于iOS - 移动视图时界面元素重叠的主要内容,如果未能解决你的问题,请参考以下文章

键盘重叠时向上移动 UITextField

设置可见性时 XML 列表视图重叠元素

选择步进器时滚动视图重叠

IOS 6子视图在父视图中重叠工具栏

UISearchDisplayController 重叠原始表格视图

如何在没有状态栏重叠的情况下在 iOS7 上呈现视图控制器