【问题标题】:Setting rootViewController on UIWindow changes UIScrollView with paging layout在 UIWindow 上设置 rootViewController 会改变 UIScrollView 与分页布局
【发布时间】:2012-06-05 01:48:11
【问题描述】:

更新

事实证明,下面的代码实际上并不是问题所在。在我的应用委托中,我正在做:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.viewController = [[ViewController alloc] init];

    self.window.rootViewController = self.viewController;// <-- this does not work
    //[self.window addSubview:self.viewController.view]; // <-- this works

    [self.window makeKeyAndVisible];
    return YES;
}

如果我删除语句“self.window.rootViewController = self.viewController”并将 viewController 的视图添加到窗口中,它就可以工作。谁能解释一下?在窗口上设置 rootViewController 是否会限制孩子的界限?我试图通过文档,但它并没有提及太多。

原帖

我在向 UIScrollView 中的页面添加填充时遇到问题。我基本上是在尝试设置一个简单的滚动视图,它在不同的页面中显示 UIView,由预定义的填充分隔(有点像没有照片的照片应用程序)。我一直在尝试从 WWDC 2010 和他们的示例应用程序 PhotoScroller 遵循 Apple 的 ScrollView 示例,但总是想出在视图中显示的填充。该应用程序当前隐藏状态栏并向窗口添加 1 个视图控制器。为了简单起见,每个页面都应该显示一个绿色的 UIView,而有填充的空间是黄色的。您应该只在用户滚动时看到黄色。以下是前 3 页:

我在 .h 文件中声明了一个名为 pagingScrollView 的类级别字段。在我的单视图控制器中,我基本上只是在尝试遵循示例代码正在执行的操作。

#define PADDING  10
#define PAGE_COUNT 3

- (void)loadView
{
    CGRect pagingScrollFrame = [[UIScreen mainScreen] bounds];
    pagingScrollFrame.origin.x -= PADDING;
    pagingScrollFrame.size.width += (2 * PADDING);
    pagingScrollView = [[UIScrollView alloc] initWithFrame:pagingScrollFrame];

    pagingScrollView.pagingEnabled = YES;
    pagingScrollView.backgroundColor = [UIColor yellowColor];
    pagingScrollView.contentSize = CGSizeMake(pagingScrollFrame.size.width * PAGE_COUNT, pagingScrollFrame.size.height);

    self.view = pagingScrollView;

    for(int i = 0; i < PAGE_COUNT; i++) {
        CGRect frame = [self frameForPageAtIndex:i];
        UIView *page = [[UIView alloc] initWithFrame:frame];
        page.backgroundColor = [UIColor greenColor];
        [pagingScrollView addSubview:page];
    }
}

- (CGRect)frameForPageAtIndex:(NSUInteger)index {
    CGRect bounds = pagingScrollView.bounds;
    CGRect pageFrame = bounds;

    pageFrame.size.width -= (2 * PADDING);
    pageFrame.origin.x = (bounds.size.width * index) + PADDING;

    return pageFrame;
}

pagingScrollFrame 的宽度为 340,因此(我认为)滚动视图将被分解为 340 像素的页面。我错过了什么?

【问题讨论】:

  • pageFrame.origin.x = (bounds.size.width - PADDING) * index 怎么样?
  • @Toro 看起来我不见了:pageFrame.origin.x = (bounds.size.width * index) + PADDING;与苹果的代码相比...谢谢,但我想我发现了真正的问题...查看我的更新
  • @RyanFerretti 您是否在其他地方向此视图控制器添加视图?我所看到的是文档状态:“将视图控制器分配给此属性(以编程方式或使用界面生成器)将视图控制器的视图安装为窗口的内容视图。如果窗口具有现有的视图层次结构,则旧的在安装新视图之前删除视图。”当调用 setRootViewController 时。所以对我来说,这听起来像是按照文档运行的。
  • @heckman 这只是一个示例应用程序,用于了解事情是如何工作的......一切都以编程方式完成,这是我编写的唯一代码。应用程序委托仅创建 1 个控制器并将其添加到窗口中。滚动视图的页面大小根据控制器/视图添加到窗口的方式而变化。我只是想了解设置 rootViewController 如何影响子视图的框架尺寸。
  • @Ryan 我看到了你的更新。至于我,我会做一个自定义的pageScrollView,并覆盖它的-layoutSubviews,以适应视图大小的变化。

标签: ios uiscrollview paging padding


【解决方案1】:

简单地看一下,您所做的事情似乎相当正确,除了内容大小的设置。你设置:

pagingScrollView.contentSize = CGSizeMake(pagingScrollFrame.size.width * PAGE_COUNT, pagingScrollFrame.size.height);

如果您的每个页面确实彼此相邻,这将是正确的,但是当您在每个视图之间添加一个 10pt 填充时,您应该有类似的内容:

pagingScrollView.contentSize = CGSizeMake(pagingScrollFrame.size.width * PAGE_COUNT + PADDING * (PAGE_COUNT - 1), pagingScrollFrame.size.height);

这应该可以解决您的问题并导致黄色不在可见区域内。

【讨论】:

  • 我尝试了你的建议,但并没有真正改变任何东西......但你的建议实际上让我走上了解决它的道路......请参阅我的更新。
【解决方案2】:

分页关闭的原因是因为在窗口上设置 RootViewController 显然是在幕后做一些事情(那是什么,我不知道)。要解决的问题是,我使用向窗口添加视图的旧方法。

[self.window addSubview:self.viewController.view];

如果你认为你知道如何在设置 RootViewController 时修复它,请告诉我!

【讨论】:

    猜你喜欢
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2013-10-18
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多