Scrollview ContentSize

时间:2016-03-19 00:18:34

标签: ios iphone swift uiscrollview

我正尝试在注册/加入页面上制作一张包含3张图片的滚动视图,以供我尝试制作的小应用。我在下面使用以下代码:

import UIKit

class ViewController: UIViewController, UIScrollViewDelegate {

    var signInButton: UIButton!
    var joinButton: UIButton!
    var pageControl: UIPageControl!
    @IBOutlet weak var scrollView: UIScrollView!
    var colors:[UIColor] = [UIColor.redColor(), UIColor.blueColor(), UIColor.greenColor(), UIColor.yellowColor()]
    var frame = CGRectMake(0, 0, 0, 0)

    override func viewDidLoad() {
        super.viewDidLoad()

        signInButton = UIButton(frame: CGRectMake(1/3.0 * self.view.bounds.size.width, 5/6.0 * self.view.bounds.size.height, 23, 60))

        joinButton = UIButton(frame: CGRectMake(2/3.0 * self.view.bounds.size.width, 5/6.0 * self.view.bounds.size.height, 23, 60))

        pageControl = UIPageControl(frame: CGRectMake(1/2.0 * self.view.bounds.size.width, 70/100.0 * self.view.bounds.size.height, 23, 60))

        self.view.addSubview(signInButton)
        self.view.addSubview(joinButton)
        self.view.addSubview(pageControl)

        signInButton.addTarget(self, action: "signInButtonClicked:", forControlEvents: .TouchUpInside)
        joinButton.addTarget(self, action: "joinButtonClicked:", forControlEvents: .TouchUpInside)
        pageControl.addTarget(self, action: Selector("changePage:"), forControlEvents: UIControlEvents.ValueChanged)

        configurePageControl()
        scrollView.delegate = self

        for index in 0...3 {
            frame.size = scrollView.frame.size
            frame.origin.x = scrollView.frame.size.width * CGFloat(index)
            scrollView.pagingEnabled = true

            let view: UIView = UIView(frame: frame)
            view.backgroundColor = colors[index]
            scrollView.addSubview(view)
        }

        self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * 4, self.scrollView.frame.size.height)
    }

    func configurePageControl() {
        self.pageControl.numberOfPages = colors.count
        self.pageControl.currentPage = 0
        self.pageControl.tintColor = UIColor.redColor()
        self.pageControl.pageIndicatorTintColor = UIColor.blackColor()
        self.pageControl.currentPageIndicatorTintColor = UIColor.greenColor()
    }

我在我的视图控制器上放置了一个scrollview(使用大小类width: Anyheight: Any),并将滚动视图的四个边固定到视图控制器。由于某些原因,我添加到滚动视图的每个视图都与iPhone的宽度不完全相同。

例如,当我尝试在iPhone 6上运行时,第一个视图超出了iPhone的宽度。这种情况发生在第二和第三种观点。我希望第一个视图是iPhone的确切宽度,第二个视图恰好位于第一个视图的右侧,依此类推。与第一个超过iPhone宽度的视图似乎有些重叠。

这可能是因为我使用的是size类(width:any和height:any),我应该禁用大小类并为每个iPhone宽度添加一个scrollview吗?

有人可以帮我在这里找出问题。

2 个答案:

答案 0 :(得分:5)

添加:

scrollView.setNeedsLayout()
scrollView.layoutIfNeeded()

viewDidLoad()方法的开头。

在使用自动布局时,在访问视图框架之前始终调用这两种方法,否则您的尺寸可能会不正确。

问题在于,当viewDidLoad()被调用时,您的view的宽度仍为600(由于您的情节提要视图控制器大小为600x600)。 您的约束要求滚动视图应与设备的宽度相同,但这些约束仅在 viewDidLoad()完成后应用,此时计算自动布局的下一个预定通行证。 添加上面的代码会强制自动布局执行传递,从而为您提供正确的帧大小,以便随后在大小计算中使用。

答案 1 :(得分:1)

放入滚动视图,设置约束。然后抓住一个UIView,将它放在滚动视图中,将其设置为相等的宽度,相等的高度,然后居中(使用CTRL +拖动到滚动视图,你会得到一个小的弹出菜单)

然后将您的内容放入刚刚创建的UIView中...... Bam!我个人也将我的UIView重命名为ContentView,只是为了清酒

这是一个帮助屏幕:

enter image description here

现在我自己仍然遇到高度问题,我通常只是在内容视图中使用固定高度,因为如果我不这样做就不会滚动....