程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了UIImageView 在 UIScrollView 内部剪切大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决UIImageView 在 UIScrollView 内部剪切?

开发过程中遇到UIImageView 在 UIScrollView 内部剪切的问题如何解决?下面主要结合日常开发的经验,给出你关于UIImageView 在 UIScrollView 内部剪切的解决方法建议,希望对你解决UIImageView 在 UIScrollView 内部剪切有所启发或帮助;

我正在尝试使用以下代码创建包含多个 UIScrollVIEwUIStackVIEwUIImageVIEw

let stackVIEw = UIStackVIEw(frame: .zero)

scrollVIEw.translatesautoresizingMaskIntoConsTraints = false
scrollVIEw.BACkgroundcolor = .green
scrollVIEw.showsHorizontalScrollinDicator = false
scrollVIEw.delegate = self

self.vIEw.addSubvIEw(scrollVIEw)


scrollVIEw.anchor(top: textSV.bottomAnchor,leading: self.vIEw.safeAreaLayoutGuIDe.leadingAnchor,bottom: anotherVIEw?.topAnchor,Trailing: self.vIEw.safeAreaLayoutGuIDe.TrailingAnchor)
scrollVIEw.wIDthAnchor.consTraint(equalToConstant: UIScreen.main.bounds.wIDth).isActive = true

scrollVIEw.contenTinsetAdjustmentBehavior = .never

stackVIEw.translatesautoresizingMaskIntoConsTraints = false
stackVIEw.diStribution = .equalSpacing
stackVIEw.spacing = 0

scrollVIEw.addSubvIEw(stackVIEw)
stackVIEw.fillSupervIEw()

for _ in 1...8 {
    let pageVIEw = UIImageVIEw(image: UIImage(named: "iphone12mockup"))
    pageVIEw.clipsToBounds = true
    pageVIEw.contentMode = .scaleAspectFit

    pageVIEw.translatesautoresizingMaskIntoConsTraints = false
    stackVIEw.addArrangedSubvIEw(pageVIEw)

    pageVIEw.anchor(top: stackVIEw.topAnchor,leading: nil,bottom: stackVIEw.bottomAnchor,Trailing: nil)
}

问题是 UIImageVIEw 没有调整到 scaleAspectFit 并且看起来像这样(看不到完整图像):

UIImageView 在 UIScrollView 内部剪切

@H_262_25@编辑
let img = UIImage(named: "iphone12mockup")
let wIDth = img?.size.wIDth

let pageVIEw = UIImageVIEw(image: img)
pageVIEw.clipsToBounds = true
pageVIEw.contentMode = .scaleAspectFit

pageVIEw.translatesautoresizingMaskIntoConsTraints = false
stackVIEw.addArrangedSubvIEw(pageVIEw)

pageVIEw.anchor(top: stackVIEw.topAnchor,Trailing: nil)
pageVIEw.wIDthAnchor.consTraint(equalToConstant: wIDth!).isActive = true

解决方法

您想使用滚动视图的内容和框架布局指南...

  • 将堆栈视图的所有 4 个边限制到滚动视图的内容布局指南
  • 将堆栈视图的高度限制为滚动视图的框架布局指南

对于您添加到堆栈视图的每个图像视图:

  • 将图像视图的宽度限制为滚动视图的框架布局指南

这是一个完整的例子:

class ViewController: UIViewController,UIScrollViewDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // just trying to include what you've shown
        let textSV = UILabel()
        textSV.BACkgroundColor = .yellow
        textSV.text = "textSV"
        textSV.textAlignment = .center
        
        let anotherView = UILabel()
        anotherView.BACkgroundColor = .cyan
        anotherView.text = "anotherView"
        anotherView.textAlignment = .center
        
        [textSV,anotherView].forEach {
            $0.translatesAutoresizingMaskIntoConsTraints = false
            view.addSubview($0)
        }
        
        // respect safe area
        let safeG = view.safeAreaLayoutGuide
        
        NSLayoutConsTraint.activate([
            textSV.topAnchor.consTraint(equalTo: safeG.topAnchor),textSV.leadingAnchor.consTraint(equalTo: safeG.leadingAnchor),textSV.TrailingAnchor.consTraint(equalTo: safeG.TrailingAnchor),textSV.heightAnchor.consTraint(equalToConstant: 60.0),anotherView.leadingAnchor.consTraint(equalTo: safeG.leadingAnchor),anotherView.TrailingAnchor.consTraint(equalTo: safeG.TrailingAnchor),anotherView.bottomAnchor.consTraint(equalTo: safeG.bottomAnchor),anotherView.heightAnchor.consTraint(equalToConstant: 60.0),])

        let scrollView = UIScrollView()
        scrollView.translatesAutoresizingMaskIntoConsTraints = false
        scrollView.BACkgroundColor = .green
        scrollView.showsHorizontalScrollInDicator = false
        scrollView.delegate = self

        view.addSubview(scrollView)
        
        // use a stack view to hold and arrange the scrollView's subviews
        let stackView = UIStackView()
        stackView.translatesAutoresizingMaskIntoConsTraints = false
        
        // add the stackView to the scrollView
        scrollView.addSubview(stackView)
        
        // use scrollView's Content Layout Guide to define scrollable content
        let layoutG = scrollView.contentLayoutGuide
        
        // use scrollView's Frame Layout Guide to define content height (since you want horizontal scrolling)
        let frameG = scrollView.frameLayoutGuide
        
        NSLayoutConsTraint.activate([

            // consTrain scrollView Top to textSV Bottom
            scrollView.topAnchor.consTraint(equalTo: textSV.bottomAnchor),// consTrain scrollView Leading/Trailing to safe area
            scrollView.leadingAnchor.consTraint(equalTo: safeG.leadingAnchor),scrollView.TrailingAnchor.consTraint(equalTo: safeG.TrailingAnchor),// consTrain scrollView Bottom to anotherView Top
            scrollView.bottomAnchor.consTraint(equalTo: anotherView.topAnchor),// consTrain all 4 sides of the stackView to scrollView's Content Layout Guide
            stackView.topAnchor.consTraint(equalTo: layoutG.topAnchor),stackView.bottomAnchor.consTraint(equalTo: layoutG.bottomAnchor),stackView.leadingAnchor.consTraint(equalTo: layoutG.leadingAnchor),stackView.TrailingAnchor.consTraint(equalTo: layoutG.TrailingAnchor),// consTrain stackView's height to scrollView's Frame Layout Guide height
            stackView.heightAnchor.consTraint(equalTo: frameG.heightAnchor),])
        
        // add imageViews to the stack view
        for _ in 1...8 {
            let pageView = UIImageView(image: UIImage(named: "iphone12mockup"))
            //let pageView = UIImageView(image: UIImage(named: "sample"))
            // set image view BACkground color so you can
            //  see its frame (since the image will be aspect-fit scaled)
            pageView.BACkgroundColor = .systemYellow
            pageView.contentMode = .scaleAspectFit
            // add it to the stack view
            stackView.addArrangedSubview(pageView)
            // consTrain its Width to scrollView's Frame Layout Guide Width
            pageView.widthAnchor.consTraint(equalTo: frameG.widthAnchor).isActive = true
        }

    }
    
}

它在启动时看起来像这样(在 iPhone 8 上):

UIImageView 在 UIScrollView 内部剪切

然后向右滚动一点:

UIImageView 在 UIScrollView 内部剪切

请注意,由于您希望将图像视图设置为 Aspect Fit,因此我给“pageView”图像视图设置了 .systemYellow 的背景色,以便您可以看到 imageView 框架填充了滚动视图框架的宽度和身高。


编辑 -- 如果您希望图像与其高度成正比,而没有“两侧的空白空间”,则需要设置与其高度成正比的图像视图宽度约束,基于图像大小。

用这个替换“添加图像视图”循环:

    // add imageViews to the stack view
    for _ in 1...8 {
        guard let img = UIImage(named: "iphone12mockup") else {
            fatalError("Could not load image!")
        }
        let pageView = UIImageView()
        pageView.image = img
        pageView.contentMode = .scaleToFill
        // add it to the stack view
        stackView.addArrangedSubview(pageView)
        // consTrain its Width proportional to the image height
        pageView.widthAnchor.consTraint(equalTo: pageView.heightAnchor,multiplier: img.size.width / img.size.height).isActive = true
    }

输出将是:

UIImageView 在 UIScrollView 内部剪切

然后向右滚动一点:

UIImageView 在 UIScrollView 内部剪切

大佬总结

以上是大佬教程为你收集整理的UIImageView 在 UIScrollView 内部剪切全部内容,希望文章能够帮你解决UIImageView 在 UIScrollView 内部剪切所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: