UIScrollView - 滚动时内容超出范围

时间:2013-06-02 16:11:31

标签: ios objective-c uiscrollview

我在界面构建器中设计了这样的

滚动视图

enter image description here

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

它变成了

enter image description here

scrollview中的内容在scrollview本身外部展开,即使在包含此scrollView的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 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:1)

我只是挣扎了一个小时并且有一个头颅的时刻。

在我的情况下,我在故事板中的场景中有一个UIView。在某些时候,我决定将其作为UIScrollView代替(而不是将UIScrollView嵌入UIView中的原始计划

我继续将UIView上的课程改为UIScrollView。 IB在文档大纲中将其更改为Scroll View,我认为我很好,对吧?

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

在某些时候它让我觉得这还不够。显然,通过IB添加UIScrollView与添加UIView有所不同,只是更改类是不够的。这可能是从头开始重新修复它的原因。

因此,对于将来遇到此问题的任何人,请务必通过IB而不是UIScrollView

添加UIView

答案 2 :(得分:0)

我遇到了与本文所述相同的问题。我尝试了多种不起作用的解决方案组合,包括:

  • 使用Clip To Bounds = YES
  • 将滚动视图放在视图中
  • 将视图放在滚动视图中,其中Clip To Bounds = YES,然后包含我的子视图
  • 将一个Container View放在滚动视图中,然后嵌入我的子视图
  • 完全重建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];

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

我与Interface Builder有一种爱/恨的关系......大多数时候我喜欢它,但有些日子我们争辩,我希望我们永远不会见面...... :)

答案 3 :(得分:0)

如果您将UIView更改为UIScrollView

,则仅在storyboard中进行cliptobound = YES