滚动视图大小自动布局:帧是600x480紧凑/任何尺寸级别,比iPhone5的大吗? [英] scrollview size with Autolayout: frame is 600x480 in compact/Any size class, bigger than iphone5?

查看:218
本文介绍了滚动视图大小自动布局:帧是600x480紧凑/任何尺寸级别,比iPhone5的大吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想我的滚动型的框架是大小为上海华的框架相同。并设置contentsize,使其包含所有imageViews。

I would like my scrollview's frame to be the same size as the superview's frame. And set the contentsize so that it contains all the imageViews.

问题是与自动版式,宽度和高度为600×480,我使用的iPhone5和大小的类W:紧凑型/ H:任何(我希望是这样的:320×523)。结果
我的约束是:平等与宽度的SuperView,高度相等与上海华(乘数0.8),水平居中X和垂直中心是

The problem is with AutoLayout, the width and height is 600 x 480, I use an iphone5 and the size class is w:Compact / h:Any.(I expected something like : 320 x 523 ).
My constraints are : Equal Width with superview, Equal Height with superview (multiplier 0.8), horizontal center X, and vertical center Y.

let pagesScrollViewSize = scrollView.frame.size
println("pagesScrollViewSize : \(pagesScrollViewSize)") //600x480
scrollView.contentSize = CGSizeMake(pagesScrollViewSize.width * CGFloat(pageCount), pagesScrollViewSize.height)

会有人知道如何解决这个问题?的imageview的显示比屏幕的框架大,所以.SizeAspectFit不遵循正确的尺寸。除了滚动到另一个ImageView的,所以滚动看到图像的其余部分,我不想要的。

Would someone know how to solve this? The imageview appears bigger than the frame of the screen, so the .SizeAspectFit does not follow the right dimensions. Instead of scrolling to another imageView, it scrolls to see the rest of the image, which I don't want.

编辑:结果
这是ViewController.swift整个code:


This is the whole code in ViewController.swift :

class ViewController: UIViewController, UIScrollViewDelegate {

    @IBOutlet weak var pageControl: UIPageControl!
    @IBOutlet weak var scrollView: UIScrollView!

    var pageViews: [UIImageView?] = []
    var pageImages : [UIImage?] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        pageImages = [UIImage(named:"photo1.png"),
        UIImage(named:"photo2.png"),
        UIImage(named:"photo3.png"),
        UIImage(named:"photo4.png")]

        let pageCount = pageImages.count
        pageControl.currentPage = 0
        pageControl.numberOfPages = pageCount

        for _ in 0..<pageCount {
            pageViews.append(nil)
        }

        let pagesScrollViewSize = scrollView.frame.size
        println("pagesScrollViewSize : \(pagesScrollViewSize)")
        scrollView.contentSize = CGSizeMake(pagesScrollViewSize.width * CGFloat(pageCount), pagesScrollViewSize.height)
        loadVisiblePages()
    }

    //when scrolling
    func scrollViewDidScroll(scrollView: UIScrollView!){
        loadVisiblePages()
    }

    func loadVisiblePages(){
        let pageWidth = scrollView.frame.size.width
        let page = Int(floor( (scrollView.contentOffset.x * 2.0 + pageWidth) / (pageWidth*2.0) ))
        println("page: \(page)")
        pageControl.currentPage = page
        let firstPage = page-1
        let lastPage = page+1
        //remove all the pages before firstPage
        for var index = 0; index < firstPage; ++index{
            purgePage(index)
        }
        //load pages in our range
        for var index = firstPage; index <= lastPage; ++index {
            loadPage(index)
        }
        //remove after lastPage
        for var index = lastPage+1; index < pageImages.count; ++index {
            purgePage(index)
        }
    }

    func loadPage(index:Int){
        if index < 0 || index >= pageImages.count {
            return
        }
        if let pageView = pageViews[index] {
            //already loaded
        }
        else {
            var frame = scrollView.bounds
            frame.origin.x = frame.size.width * CGFloat(index)
            frame.origin.y = 0.0
            println("\(frame)")

            var newImageView = UIImageView(image:pageImages[index])
            newImageView.contentMode = .ScaleAspectFit
            newImageView.frame = frame
            scrollView.addSubview(newImageView)

            pageViews[index] = newImageView
        }
    }

    func purgePage(index:Int){
        if index < 0 || index >= pageImages.count {
            return
        }
        if let pageView = pageViews[index] {
            pageView.removeFromSuperview()
            pageViews[index] = nil
        }
    }

}

感谢

推荐答案

大小类(或任何自动布局的变化,对于这个问题)后, viewDidAppear 不应用到或 viewDidLayoutSubviews 。您将需要此code移动到其中的一个。您所看到的视图的框架,因为它是装出来的界面生成器文件(厦门国际银行或故事板)的。你永远不应该被检查帧数,直到这些生命周期事件之后。

Size classes (or any auto layout changes, for that matter) are not applied until after viewDidAppear or viewDidLayoutSubviews. You will need to move this code into one of those. You are seeing the frame of the view as it is loaded out of the Interface Builder document (xib or storyboard). You should never be checking frames until after those lifecycle events.

<一个href=\"http://stackoverflow.com/questions/13079172/unable-to-set-frame-correctly-before-viewdidappear\">Unable viewDidAppear 之前正确设置帧

这篇关于滚动视图大小自动布局:帧是600x480紧凑/任何尺寸级别,比iPhone5的大吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆