解释iOS7中的automaticAdjustsScrollViewInsets,extendedLayoutIncludesOpaqueBars,edgesForExtendedLayout之间的区别

use*_*819 247 xcode objective-c uiviewcontroller ios ios7

我一直在阅读很多关于iOS7 UI过渡的内容.

我不能够得到什么这三个属性automaticallyAdjustsScrollViewInsets,extendedLayoutIncludesOpaqueBars,edgesForExtendedLayout

例如,我试图让我的视图控制器从状态栏下面开始,但我无法实现它.

Ant*_* MG 614

从iOS7开始,视图控制器默认使用全屏布局.同时,您可以更好地控制它的视图布局,并使用这些属性完成:

edgesForExtendedLayout

基本上,通过此属性,您可以设置视图的哪些边可以扩展以覆盖整个屏幕.想象一下,你推进了UIViewController一个UINavigationController.当布局该视图控制器的视图时,它将从导航栏结束的位置开始,但此属性将设置视图的哪一侧(顶部,左侧,底部,右侧)可以扩展以填充整个屏幕.

让我们看一个例子:

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
Run Code Online (Sandbox Code Playgroud)

这里您没有设置值edgesForExtendedLayout,因此默认值为take(UIRectEdgeAll),因此视图扩展其布局以填充整个屏幕.

这是结果:

没有边缘用于扩展布局,视图填满整个屏幕

如您所见,红色背景延伸到导航栏和状态栏后面.

现在,您要将该值设置为UIRectEdgeNone,因此您告诉视图控制器不要扩展视图以覆盖屏幕:

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
viewController.edgesForExtendedLayout = UIRectEdgeNone;
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
Run Code Online (Sandbox Code Playgroud)

结果如下:

设置了edgesForExtendedLayout,视图就在导航下面

automaticallyAdjustsScrollViewInsets

当您的视图是UIScrollView或类似的时候使用此属性,例如UITableView.您希望您的表从导航栏结束的位置开始,因为如果没有,您将看不到整个内容,但同时您希望您的表在滚动时覆盖整个屏幕.在这种情况下,设置edgesForExtendedLayout为None将不起作用,因为您的表将开始滚动导航栏结束的位置,它不会在它后面.

这里是这个属性派上用场的地方,如果让视图控制器自动调整insets(将此属性设置为YES,也是默认值),它会将insets添加到表的顶部,这样表将从导航开始的地方栏结束,但滚动将覆盖整个屏幕.

这是当设置为NO时:

该表将滚动整个屏幕,但开始部分覆盖

和(默认情况下):

桌子滚动整个屏幕,并在导航下方启动

在这两种情况下,表格在导航栏后面滚动,但在第二种情况下(是),它将从导航栏下方开始.

extendedLayoutIncludesOpaqueBars

这个值只是对以前的值的补充.默认情况下,此参数设置为NO.如果状态栏不透明,则视图将不会扩展为包括状态栏,即使您将视图扩展到覆盖它(edgesForExtendedLayoutto UIRectEdgeAll)也是如此.

如果将值设置为YES,则会允许视图再次位于状态栏下方.

如果事情不明确,请写评论,我会回答.

iOS如何知道UIScrollView的用途?

iOS抓取ViewController视图中的第一个子视图,索引为0的子视图,如果它是子类,UIScrollView则将解释的属性应用于它.

当然,这意味着UITableViewController默认工作(因为它UITableView是第一个视图).

  • 这个解释比iOS 7 UI Transition Guide要好很多.这应该只是取代指南,这对我来说毫无意义. (21认同)
  • 我认为extendedLayoutIncludesOpaqueBars 默认应该是YES 而不是NO。更改视图颜色(半透明)不应影响布局。 (2认同)

Ali*_*dle 15

不确定您是否正在使用故事板,但如果您正在使用,请使视图控制器从状态栏下方(并在底部栏上方)开始:

在IB中选择视图控制器,在属性检查器中,取消选择"扩展边缘 - 在顶部条形图下"和"延伸边缘 - 在底部条形图下".


Chr*_*ley 10

我正在使用故事板并使用上述建议,但我不确定如何实现它.下面是一个简短的例子,它通过将推荐的解决方案放入ViewController来快速解决问题.

import Foundation
import UIKit

// This ViewController is connected to a view on a storyboard that 
// has a scrolling sub view.
class TheViewController: UIViewController {

  // Prepares the view prior to loading.  Putting it in viewDidAppear didn't work.
  override func viewWillAppear(animated: Bool) {

    // this method is an extension of the UIViewController 
    // so using self works as you might expect.
    self.automaticallyAdjustsScrollViewInsets = false

    // Default is "true" so this sets it to false tells it to use 
    // the storyboard as you have it placed
    // and not how it thinks it should place it.
  }

}
Run Code Online (Sandbox Code Playgroud)

我的问题:默认情况下,自动调整设置为true会导致故事板设计和模拟器之间出现差异 默认情况下,

已解决:已应用上述代码,关闭自动调整功能. 上面的代码适用,关闭自动调整.

  • 如果打开automaticAdjustsScrollViewInsets为YES,则应将顶部约束设置为superview而不是topGuideLayout. (5认同)

小智 5

我通过添加这一行解决了这个问题,但我的问题与a有关UIView,而不是UIScrollView

self.navigationController.navigationBar.translucent = NO;
Run Code Online (Sandbox Code Playgroud)