XCode - UIScrollView 分页不显示子视图(自动布局?)

Posted

技术标签:

【中文标题】XCode - UIScrollView 分页不显示子视图(自动布局?)【英文标题】:XCode - UIScrollView Paging Not Showing SubView (Auto Layout?) 【发布时间】:2012-11-15 21:15:13 【问题描述】:

我之前制作了一个使用 UIScrollView 和 Paging 的项目,但是在这个新项目中,我一直在努力解决这个问题,无法让它工作。我认为问题可能在于 AutoLayout。起初,我什至无法让分页动作起作用,直到我意识到所有初始化都必须在 viewDidAppear 而不是 ViewDidLoad 中完成。

现在我已经完成了分页操作,子视图不加载!它只会将我在 Storyboard 中设置的当前视图推开,只显示空白背景。

请注意,这里的代码与我之前的项目几乎相同,但我无法显示第二个视图(第 2 页)。

以下是部分代码:

- (void)viewDidAppear:(BOOL)animated
self.scrollView.delegate = self;
// view controllers are created lazily
// in the meantime, load the array with placeholders which will be replaced on demand
NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < kNumberOfPages; i++)

    [controllers addObject:[NSNull null]];

self.viewControllers = controllers;

// a page is the width of the scroll view
scrollView.pagingEnabled = YES;
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages, (scrollView.frame.size.height - 50));
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
scrollView.scrollsToTop = NO;
scrollView.delegate = self;

pageControl.numberOfPages = kNumberOfPages;
pageControl.currentPage = 0;

// pages are created on demand
// load the visible page
// load the page on either side to avoid flashes when the user starts scrolling
//
[self loadScrollViewWithPage:1];





- (void)loadScrollViewWithPage:(int)page

if (page <= 0)
    return;
if (page >= kNumberOfPages)
    return;

PageOneViewController *controller = [viewControllers objectAtIndex:1];


if ((NSNull *)controller == [NSNull null])

    if(page == 1)
    

        controller = [[PageOneViewController alloc] initWithRequestNumber: @"100" forID:self.idNumberFromLogin];
        [viewControllers replaceObjectAtIndex:page withObject:controller];
        CGRect frame = scrollView.frame;
        frame.origin.x = frame.size.width * 1;
        frame.origin.y = 0;
        controller.view.frame = frame;
        [scrollView addSubview:controller.view];
    



在 PageOneViewController 中

 - (id)initWithRequestNumber:(NSString *)requestID forID: (NSString *) employeeID


   if (self = [super initWithNibName:@"OpenRequestCommView" bundle:nil])
   

   

   return self;


【问题讨论】:

你能用自动布局来解决这个问题吗? 【参考方案1】:

您可能在情节提要上启用了自动布局。

您可以通过在情节提要中选择文件检查器并取消选中“使用自动布局”来禁用自动布局。

【讨论】:

在这种情况下是否可以使用自动布局? 让我们同意自动布局用于控制视图布局的大小/位置。自动布局为您节省大量时间和代码行来调整纵向和横向的控件(按钮、标签、子视图)。现在,我不确定 Alan 的情况是否适合使用自动布局。【参考方案2】:

您需要将此代码放入您的 .m

#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )

之后

为此更新您的代码

- (void)viewWillAppear:(BOOL)animated

    [super viewWillAppear:animated];
    if (IS_WIDESCREEN) 

        self.meuScroll.frame = CGRectMake(0, 0, 320, 468);

     else 

        self.meuScroll.frame = CGRectMake(0, 0, 320, 380);

    


- (void)viewWillDisappear:(BOOL)animated

    [super viewWillDisappear:animated];
    if (IS_WIDESCREEN) 

        self.meuScroll.contentSize = CGSizeMake(320, 468);

     else 

        self.meuScroll.contentSize = CGSizeMake(320, 380);

    

【讨论】:

【参考方案3】:

上述问题中的代码是基于 Apple 提供的使用 UIScrollView 进行分页的示例代码构建的。我在我的应用程序中使用了相同的代码,并花了几个小时阅读教程、堆栈溢出问题和示例代码,但没有什么可以解决其滚动视图的自动布局问题。事实证明,您只需要在返回 scrollView 作为控制器视图的方法中添加一行代码。 (这是示例代码中的PhoneContentController类)

- (UIView *)view

    [self.scrollView setTranslatesAutoresizingMaskIntoConstraints:YES];
    return self.scrollView;

【讨论】:

以上是关于XCode - UIScrollView 分页不显示子视图(自动布局?)的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter 分页不呈现分页链接

Laravel 方法分页不存在

分页不添加类

为啥页码显示不出来?

为啥分页不起作用并在 wordpress 网站上出现 404 错误?

AngularJS 1.6 分页不显示