【问题标题】:Scroll view paging content size doesn't work with iphone 5s ios 12滚动视图分页内容大小不适用于 iphone 5s ios 12
【发布时间】:2020-11-22 22:51:40
【问题描述】:

我有一个带有 3 张图像的水平分页滚动视图。 这是我 viewDidLoad 中的代码:

for index in 0..<images.count {
    frame.origin.x = scrollView.frame.size.width * CGFloat(index)
    frame.size = scrollView.frame.size
              
    let UrlImage = NSURL(string: images[index] as! String)
    let dataImage = NSData(contentsOf: UrlImage! as URL)
    if dataImage != nil {
                                
        let imgView = UIImageView(frame: frame)
        imgView.image = UIImage(data: dataImage! as Data)
        imgView.contentMode = .scaleAspectFit
        self.scrollView.backgroundColor = .lightGray
        self.scrollView.addSubview(imgView)
                                
    }
}

scrollView.contentSize = CGSize(width: (scrollView.frame.size.width * CGFloat(images.count)), height: scrollView.frame.size.height)
scrollView.delegate = self

结果如下:

如果我尝试使用最后的 iphone 设备,它可以正常工作。但是,如果我尝试使用带有 ios12 的 iphone 5s,内容大小不起作用,结果如下:

我该如何解决这个问题?我已经尝试了 3 天

【问题讨论】:

  • scrollView.contentSize 在 for 循环内吗?
  • 不,这不在循环中
  • 将您的图像视图放在堆栈视图中,并让自动布局处理所有滚动视图内容大小的更新。

标签: swift xcode uiscrollview autolayout uiimageview


【解决方案1】:

我假设您有代码来处理页面控件和滚动委托...

这是一个非常简单的示例,使用 UIStackView 来保存 3 个图像视图:

class ViewController: UIViewController {

    let scrollView = UIScrollView()
    let stack = UIStackView()
    let pageControl = UIPageControl()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // scroll view properties
        scrollView.backgroundColor = .gray
        scrollView.isPagingEnabled = true
        
        // stack view properties
        stack.axis = .horizontal
        stack.alignment = .fill
        stack.distribution = .fillEqually
        stack.spacing = 0

        // page control properties
        pageControl.backgroundColor = .white
        pageControl.pageIndicatorTintColor = .darkGray
        pageControl.currentPageIndicatorTintColor = .blue
        
        // we're going to use constraints
        scrollView.translatesAutoresizingMaskIntoConstraints = false
        stack.translatesAutoresizingMaskIntoConstraints = false
        pageControl.translatesAutoresizingMaskIntoConstraints = false

        scrollView.addSubview(stack)
        view.addSubview(scrollView)
        view.addSubview(pageControl)
        
        // respect safe area
        let g = view.layoutMarginsGuide
        
        NSLayoutConstraint.activate([

            // scroll view constrained Top / Leading / Trailing
            scrollView.topAnchor.constraint(equalTo: g.topAnchor),
            scrollView.leadingAnchor.constraint(equalTo: g.leadingAnchor),
            scrollView.trailingAnchor.constraint(equalTo: g.trailingAnchor),
            
            // scroll view height = 1/2 of view height
            scrollView.heightAnchor.constraint(equalTo: g.heightAnchor, multiplier: 0.5),
            
            // stack view constrained Top / Bottom / Leading / Trailing of scroll view
            stack.topAnchor.constraint(equalTo: scrollView.topAnchor),
            stack.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
            stack.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
            stack.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor),
            
            // stack view height == scroll view height
            stack.heightAnchor.constraint(equalTo: scrollView.heightAnchor),
            
            // page control centered horizontally just below the scroll view
            pageControl.topAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: 4.0),
            pageControl.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor),
            
        ])
        
        // add three image views to the stack view
        for _ in 1...3 {
            let v = UIImageView()
            v.backgroundColor = .lightGray
            v.contentMode = .scaleAspectFit
            stack.addArrangedSubview(v)
        }
        
        // stack distribution is set to .fillEqually, so we only need to set the
        // width constraint on the first image view
        
        // unwrap it
        if let v = stack.arrangedSubviews.first {
            // stack view has 8-pts on each side
            v.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true
        }
        
        pageControl.numberOfPages = 3
        
        // set delegates...
        // implement page control funcs...
        // etc...
        
        // start image retrieval process
        downloadImages()
    }

    func downloadImages() -> Void {
        // get 3 "placeholder" images
        // 400x300  400x400  300x400
        
        let urls: [String] = [
            "https://via.placeholder.com/400x300.png/FF0000/FFF",
            "https://via.placeholder.com/400x400.png/00AA00/FFF",
            "https://via.placeholder.com/300x400.png/0000FF/FFF",
        ]
        
        for (v, urlString) in zip(stack.arrangedSubviews, urls) {
            if let imgView = v as? UIImageView, let url = URL(string: urlString)  {
                imgView.load(url: url)
            }
        }
    }

}

// async download image url from: https://www.hackingwithswift.com/example-code/uikit/how-to-load-a-remote-image-url-into-uiimageview
extension UIImageView {
    func load(url: URL) {
        DispatchQueue.global().async { [weak self] in
            if let data = try? Data(contentsOf: url) {
                if let image = UIImage(data: data) {
                    DispatchQueue.main.async {
                        self?.image = image
                    }
                }
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2020-02-05
    相关资源
    最近更新 更多