UIScrollView在所有模拟器上滚动,但不在我的iPhone上滚动

时间:2014-10-09 09:07:25

标签: iphone ios7 uiscrollview ios8 xcode6

因此,在弄清楚scrollView如何工作之后,我已使用以下代码实现它:

self.scrollView.delegate = self;
self.scrollView.userInteractionEnabled = YES;
CGRect view = CGRectMake(0, 0, 320, 750);
self.scrollView.contentSize = view.size;

上面的代码按照预期在Xcode 6中的所有模拟器上工作。但是,当我运行它的手机(ios7上的iphone4s)时,滚动根本不起作用。自新版本发布以来,人们是否遇到过同样的问题?或者我错过了我从文档中学到的东西?

3 个答案:

答案 0 :(得分:2)

这里有同样的问题。只需要在viewDidLayoutSubviews中调整scrollview的帧大小,它会覆盖自动布局。

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    [scrollView setContentSize:CGSizeMake(320, 2600)];

    // Adjust frame for iPhone 4s
    if (self.view.bounds.size.height == 480) {
        scrollView.frame = CGRectMake(0, 0, 320, 436); // 436 allows 44 for navBar
    }
}

答案 1 :(得分:0)

在AutoLayout中

通常,“自动布局”会将视图的顶部,左侧,底部和右侧边缘视为可见边缘。也就是说,如果将视图固定到其超视图的左边缘,则实际上将其固定到超视图边界的最小x值。更改超级视图的边界原点不会更改视图的位置。

UIScrollView类通过更改其边界的原点来滚动其内容。要使其与“自动布局”一起使用,滚动视图中的顶部,左侧,底部和右侧边缘现在表示其内容视图的边缘。

滚动视图子视图的约束必须导致填充大小,然后将其解释为滚动视图的内容大小。 (这不应与用于自动布局的intrinsicContentSize方法混淆。)要使用自动布局调整滚动视图的框架大小,约束必须明确关于滚动视图的宽度和高度,或者滚动视图的边缘必须是与其子树之外的视图相关联。

请注意,您可以通过在视图和滚动视图子树外部的视图之间创建约束(例如滚动视图的超级视图),使滚动视图的子视图显示为浮动(不滚动)其他滚动内容。

以下是两个如何配置滚动​​视图的示例,首先是混合方法,然后是纯方法

混合方法

使用滚动视图外部的约束来定位和调整滚动视图的大小 - 也就是说,translatesAutoresizingMaskIntoConstraints属性设置为NO。

为滚动视图创建一个简单的UIView内容视图,该视图将是您希望内容具有的大小。使其成为滚动视图的子视图,但让它继续将自动调整蒙版转换为约束:

- (void)viewDidLoad {
UIView *contentView;



contentView = [[UIView alloc] initWithFrame:CGRectMake(0,0,contentWidth,contentHeight)];



[scrollView addSubview:contentView];

//不要更改contentView的translatesAutoresizingMaskIntoConstraints, //默认为YES;

//设置滚动视图的内容大小以匹配内容视图的大小:

[scrollView setContentSize:CGSizeMake(contentWidth,contentHeight)];

/ *这里的其余代码...... * /

}

创建要放入内容视图的视图并配置其约束,以便将它们放置在内容视图中。

或者,您可以创建一个视图子树进入滚动视图,设置约束,并调用systemLayoutSizeFittingSize:方法(使用UILayoutFittingCompressedSize选项)来查找要用于内容视图和contentSize的大小滚动视图的属性

纯自动布局方法

要使用纯自动布局方法,请执行以下操作:

在所涉及的所有视图上将translatesAutoresizingMaskIntoConstraints设置为NO。 使用滚动视图外部的约束来定位和调整滚动视图的大小。 使用约束在滚动视图中布置子视图,确保约束与滚动视图的所有四个边相关联,并且不依赖于滚动视图来获取它们的大小。 一个简单的例子是大图像视图,其具有从图像大小导出的内在内容大小。在视图控制器的viewDidLoad方法中,您将包含与下面列表中显示的代码类似的代码:

- (void)viewDidLoad {
UIScrollView *scrollView;
UIImageView *imageView;
NSDictionary *viewsDictionary;

// Create the scroll view and the image view.
scrollView  = [[UIScrollView alloc] init];
imageView = [[UIImageView alloc] init];

// Add an image to the image view.
[imageView setImage:[UIImage imageNamed:"MyReallyBigImage"]];

// Add the scroll view to our view.
[self.view addSubview:scrollView];

// Add the image view to the scroll view.
[scrollView addSubview:imageView];

// Set the translatesAutoresizingMaskIntoConstraints to NO so that the views autoresizing mask is not translated into auto layout constraints.
scrollView.translatesAutoresizingMaskIntoConstraints  = NO;
imageView.translatesAutoresizingMaskIntoConstraints = NO;

// Set the constraints for the scroll view and the image view.
viewsDictionary = NSDictionaryOfVariableBindings(scrollView, imageView);
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|" options:0 metrics: 0 views:viewsDictionary]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|" options:0 metrics: 0 views:viewsDictionary]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[imageView]|" options:0 metrics: 0 views:viewsDictionary]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[imageView]|" options:0 metrics: 0 views:viewsDictionary]];

/* the rest of your code here... */
}

答案 2 :(得分:-2)

我没有尝试过Vishu的回答,但我所做的是更新到iOS 8,因此它与Xcode 6兼容并且有效!