4

我像这样在界面构建器中设计滚动视图

在此处输入图像描述

这里看起来不错。但不幸的是,当我在模拟器或设备上运行它时

它成为了

在此处输入图像描述

滚动视图中的内容在滚动视图本身之外扩展,即使在包含此滚动视图的 UIView 之外。

在我的 viewDidLoad (面板是 scrollView 的容器)

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    CGFloat adjustPanelHeight = [PTTScreenScaleUtil getAdjustHeight:self.panel.frame.size.height];
    CGRect panelRect = self.panel.frame;
    panelRect.size.height = adjustPanelHeight;
    self.panel.frame = panelRect;

    UIImage *image = [UIImage imageNamed:@"panel-background"];
    UIGraphicsBeginImageContext(self.panel.frame.size);
    [image drawInRect:CGRectMake(0, 0, self.panel.frame.size.width, adjustPanelHeight)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self.panel setBackgroundColor:[UIColor colorWithPatternImage:newImage]];

    NSLog(@"scrollView Height : %f", self.scrollView.frame.size.height);
    NSLog(@"scrollView contentSize Height : %f", self.scrollView.contentSize.height);
//    CGRect scrollViewRect = self.scrollView.frame;
//    CGRect scrollViewContentRect = self.scrollView.frame;
//    NSLog(@"ScrollView Height Before : %f , After : %f", self.scrollView.frame.size.height, [PTTScreenScaleUtil getAdjustHeight:self.scrollView.frame.size.height]);
//    scrollViewRect.size.width = 280;
//    scrollViewRect.size.height = [PTTScreenScaleUtil getAdjustHeight:270];
//    self.scrollView.frame = scrollViewRect;
//    [self.detailsLabel sizeToFit];
    UIView *view = [[self.scrollView subviews] objectAtIndex:0];
//    [view sizeToFit];
//    [self.scrollView setContentMode:UIViewContentModeScaleAspectFit];
//    NSLog(@"ContentSize Height : %f", view.frame.size.height);
//    scrollViewContentRect.size.height = view.frame.size.height;
    NSLog(@"Bounds : %f", view.bounds.size.height);
    self.scrollView.frame = CGRectMake(10, 10, 280, 270);
    self.scrollView.contentSize = CGSizeMake(280, 500);
    NSLog(@"Frame Height %f", self.scrollView.frame.size.height);
    //[self.scrollView setContentSize: CGSizeMake(280, 1000)];

    CGRect termBtnRect = self.termBtn.frame;
    CGRect mailBtnRect = self.mailBtn.frame;
    CGRect twitterBtnRect = self.twitterBtn.frame;
    CGRect fbBtnRect = self.fbBtn.frame;
    termBtnRect.origin.y = adjustPanelHeight - 10 - termBtnRect.size.height;
    mailBtnRect.origin.y = adjustPanelHeight - 10 - termBtnRect.size.height;
    twitterBtnRect.origin.y = adjustPanelHeight - 10 - termBtnRect.size.height;
    fbBtnRect.origin.y = adjustPanelHeight - 10 - termBtnRect.size.height;
    self.termBtn.frame = termBtnRect;
    self.mailBtn.frame = mailBtnRect;
    self.twitterBtn.frame = twitterBtnRect;
    self.fbBtn.frame = fbBtnRect;
}

所有日志返回 270.0

PS。即使内容在外面,滚动条也是正确的,但滚动条工作正常(留在滚动视图的框架中,就像在界面构建器中排列一样)我不知道如何解决这个问题。请任何人帮助我。

谢谢。

4

4 回答 4

14

通过在界面生成器中创建新的视图控制器来解决它,并仔细和宾果游戏重做相同的过程。有用。

当我比较两个视图控制器时,我意识到错误的 UIScrollView Clip Subviews 未被选中。检查时问题解决。

于 2013-06-03T03:01:42.233 回答
1

我只是为此挣扎了一个小时,然后头晕目眩。

就我而言,我UIView在情节提要中有一个现场。在某些时候我决定我需要它来UIScrollView代替(而不是原来的计划是嵌入UIScrollViewa UIView

我继续将课程更改UIViewUIScrollView。IB 在 Document Outline 中将其更改为 Scroll View,我觉得我很好,对吧?

然后我看到你描述的行为。

在某些时候,我觉得这还不够。显然,UIScrollView通过 IB 添加一个与添加一个不同的事情UIView并且仅仅改变类是不够的。这可能是从头开始为您修复它的原因。

因此,对于将来遇到此问题的任何人,请确保您添加了UIScrollViewvia IB 而不是UIView

于 2014-10-10T20:56:40.577 回答
0

我遇到了与这篇文章中描述的相同的问题。我尝试了多种无效的解决方案组合,包括:

  • 将滚动视图放在具有 Clip To Bounds = YES 的视图中
  • 使用 Clip To Bounds = YES 在滚动视图中放置一个视图,然后包含我的子视图
  • 在滚动视图中放置一个容器视图,然后嵌入我的子视图
  • 完全重建 Interface Builder 文件
  • 为滚动视图和容器视图系统地自动调整掩码选项的每个组合
  • 系统地为每个元素启用或禁用剪辑到边界

有问题的子视图以前在滚动视图中工作,但在这种情况下,内容超出滚动视图的边界时不会。

最后,我在代码中实现了解决方案,因为我找不到让 Interface Builder 合作的方法:

// There are two scroll areas on the screen, the left view and the right view.
// We want the right view to contain a scrollable area with another child view controller
// we designed in Interface Builder.

// create a scroll view to fill the right view with a scrollable area
CGSize rightFrameSize = self.rightView.bounds.size;
scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake (0, 0, rightFrameSize.width, rightFrameSize.height)];
scrollView.contentSize = CGSizeMake(640, 1352);
[self.rightView addSubview:scrollView];

// now create our child view controller from Interface Builder and add it to the scroll view
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"CustomerAddress" bundle:[NSBundle mainBundle]];
detailsView = [sb instantiateViewControllerWithIdentifier:@"CustomerDetailsView"];
detailsView.delegate = self;
detailsView.customer = _customer;
[scrollView addSubview:detailsView.view];

你当然可以从你在 Interface Builder 中使用的子视图控制器获取 scrollView.contentSize scrollView.contentSize = detailsView.view.frame.size

我对 Interface Builder 有爱/恨的关系......大多数时候我喜欢它,但有些时候我们会争吵,我希望我们从未见过...... :)

于 2013-08-30T17:48:42.670 回答
0

如果您将 UIView 更改为 UIScrollView,则仅在情节提要中制作 cliptobound=YES

于 2016-10-08T04:32:45.163 回答