为什么水平滚动视图内容之间存在差距?

时间:2015-07-27 15:54:49

标签: ios swift autolayout

我设置了UIScrollView,其中包含两个ViewController's。这就是我viewDidLoad的样子:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    scrollView.delegate = self

    self.automaticallyAdjustsScrollViewInsets = false

    let allViewController = self.storyboard!.instantiateViewControllerWithIdentifier("All") as! AllViewController;
    let favoritesViewController = self.storyboard!.instantiateViewControllerWithIdentifier("Favorites") as! FavoritesViewController;

    scrollView!.contentSize = CGSizeMake(2*CGRectGetWidth(allViewController.view.frame), CGRectGetHeight(scrollView!.frame));

    let viewControllers = [allViewController, favoritesViewController]

    var idx:Int = 0;

    for viewController in viewControllers {
        addChildViewController(viewController);
        let originX:CGFloat = CGFloat(idx) * CGRectGetWidth(scrollView!.frame);
        viewController.view.frame = CGRectMake(originX, 0, viewController.view.frame.size.width, viewController.view.frame.size.height);
        scrollView!.addSubview(viewController.view)
        viewController.didMoveToParentViewController(self)
        idx++;
    } 

在iPhone 6模拟器上一切正常,但是当我在iPhone 5模拟器上运行时,滚动时控制器之间存在间隙:

[enter image description here] scrollView的自动布局设置为0,用于前导,尾随,顶部和底部。

4 个答案:

答案 0 :(得分:2)

如果您想在viewDidLoad:中设置来源,并且您肯定知道滚动视图将具有屏幕宽度,请在计算逻辑中使用

而不是CGRectGetWidth(scrollView!.frame)
var bounds = UIScreen.mainScreen().bounds
var width = bounds.size.width

为了在子视图布局之前获得适当的宽度。

代码: Working Github Project

<强> UPD: 正如这里提到的那样,我取消选中了scrollview的Autoresize Subviews属性,子类UITableViewCell并将我的提交推送到github。通过我上面提供的链接检查它。按钮向右对齐的结果如下:

<强>结果:

enter image description here enter image description here

<强>参考: 我的答案here

中描述了主要概念

答案 1 :(得分:1)

您在视图中设置视图控制器位置是否已加载。此时,视图的尺寸将与故事板中的视图大小相匹配。我假设您正在使用4.7&#34;你的故事板中的视图。这意味着在viewDidLoad中,您将第二个视图控制器的x位置设置为375.在viewWillAppear或didLayoutSubviews中设置视图控制器位置以获得正确的视图宽度(iPhone 5上的320)。注意,这两种方法都可以多次调用,因此可以进行相应的计划。

答案 2 :(得分:1)

如果您的子视图应该始终是滚动​​视图的大小,那么最简单的解决方案可能是添加UIScrollView的自定义子类,它只是按照添加的顺序布局所有子视图,如下所示:

import UIKit

class MyScrollView: UIScrollView {

    override func layoutSubviews() {
        super.layoutSubviews()
        var idx:Int = 0;
        contentSize = CGSizeMake(2*CGRectGetWidth(bounds), CGRectGetHeight(bounds));
        for sview in self.subviews as! [UIView] {
            let originX:CGFloat = CGFloat(idx) * CGRectGetWidth(bounds);
            sview.frame = CGRectMake(originX, 0, CGRectGetWidth(bounds), CGRectGetHeight(bounds));
            idx++
        }
    }

}

然后,您可以将viewDidLoad简化为

override func viewDidLoad() {
    super.viewDidLoad()

    self.automaticallyAdjustsScrollViewInsets = false

    let allViewController = self.storyboard!.instantiateViewControllerWithIdentifier("All") as! AllViewController;
    let favoritesViewController = self.storyboard!.instantiateViewControllerWithIdentifier("Favorites") as! FavoritesViewController;

    for viewController in [allViewController, favoritesViewController] {
        addChildViewController(viewController);
        scrollView!.addSubview(viewController.view)
        viewController.didMoveToParentViewController(self)
    }
}

答案 3 :(得分:0)

在滚动视图中添加两个子视图作为占位符,并在它们和scrollview之间添加约束,并将两个@IBOutlet添加到占位符。
在viewDidLoad中只需设置scrollView大小,添加childViewControlers并将其视图添加到占位符