ios - sendSubviewToBack和bringSubviewToFront导致根视图控制器的子视图向上移动并被导航栏重叠

时间:2015-03-20 14:15:17

标签: ios objective-c uiscrollview uiimageview

我遇到sendSubviewToBack和bringSubviewToFront调用的问题。我使用programmaticaly创建了UIImageView和ScrollView以及其他几个元素(如按钮和标签)(只在故事板中创建了ScrollView)。 UIImageView必须保存背景图像。 ScrollView和UIImageView被添加为视图控制器的子视图(其他元素是scrollview的子视图)。在我创建UIImageView并像这样设置图像后,我调用

self.backgroundImage = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height)];
[self.backgroundImage setImage:[UIImage imageNamed:@"chooseDoctorBackground"]];
[self.view addSubview:self.backgroundImage];
[self.view sendSubviewToBack:self.backgroundImage];

之后,滚动视图“向上移动”并被导航栏重叠(如果我们不调用sendSubviewToFront则不会发生这种情况)。有一个简单的解决方法 - 只需在考虑导航栏和状态栏高度的情况下明确定义UIImageView和UIScrollView的位置(使用setFrame)。但是,我不明白这种行为的根本原因。你能解释一下吗?

提前致谢!

1 个答案:

答案 0 :(得分:2)

我来到这里寻找类似问题的帮助,并且已经找出了我们两个问题的原因:

当UIScrollView是您视图的最后面的子视图时,iOS会自动填充UIScrollView的内容以考虑状态栏和导航栏。这就是为什么您的滚动视图的内容最初显示正常。

致电时

[self.view sendSubviewToBack:self.backgroundImage];

您的UIImageView成为最后面的子视图,UIScrollView不再自动填充。这就是为什么UIScrollView的内容在导航栏下方向上移动的原因。

您需要手动设置滚动视图的框架或内容偏移量以考虑状态和导航栏,以支持背后出现的背景视图。

(根据我的经验,即使滚动视图的y原点非零并且它位于屏幕下方,在状态或导航栏附近,也会发生UIScrollView上的自动换行为。)