代码之家  ›  专栏  ›  技术社区  ›  Dani iman kazemayni

不改变宽度的视图

  •  1
  • Dani iman kazemayni  · 技术社区  · 6 年前

    我有一个 UIStackView UIImageViews 可能是1到5。每个 UIImageView 有一个来自数组的图像(来自以前下载和缓存的图像),我想保留 UIImageView视图 让我们保持一个完美的循环。我换了衣服 width UIStackView公司 如果有3个以上的图像,则以重叠的方式显示图像之间的间距。

    changeNavStackWidth 函数更改 宽度 UIStackView公司 ,宽度没有更新,我不知道为什么。

    var userImages = [String]() 
    
    var navStackView : UIStackView = {
        let stack = UIStackView()
        stack.axis = .horizontal
        stack.alignment = .fill
        stack.distribution = .fillEqually
        stack.translatesAutoresizingMaskIntoConstraints = false
        return stack
    }()
    override func viewDidLoad() {
        super.viewDidLoad()
        setupNavStack()
        navBarStackTapGesture()
    }
    
    func setupNavStack() {
        guard let navController = navigationController else { return }
    
        navController.navigationBar.addSubview(navStackView)
        // x, y, w, h
        navStackView.widthAnchor.constraint(equalToConstant: 95).isActive = true
        navStackView.centerYAnchor.constraint(equalTo: navController.navigationBar.centerYAnchor).isActive = true
        navStackView.heightAnchor.constraint(equalToConstant: 35).isActive = true
        navStackView.centerXAnchor.constraint(equalTo: navController.navigationBar.centerXAnchor).isActive = true
    
    } 
    
            func setNavBarImages() {
    
        for image in userImages {
            let imageView = UIImageView()
            // imageView.image = UIImage(named: image)
    
            let photoURL = URL(string: image)
            imageView.sd_setImage(with: photoURL)
    
            imageView.layer.borderColor = UIColor.white.cgColor
            imageView.layer.borderWidth = 1
            imageView.contentMode = .scaleAspectFill
            imageView.clipsToBounds = true
    
            navStackView.addArrangedSubview(imageView)
            navStackView.layoutIfNeeded()
        }
    
        switch userImages.count {
        case 0:
            print("0 images")
        case 1:
            changeNavStackWidth(constant: 35, spacing: 0)
            //changeNavStackWidth(constant: 60, spacing: 0)
        case 2:
            changeNavStackWidth(constant: 80, spacing: 10)
        case 3:
            changeNavStackWidth(constant: 95, spacing: -5)
        case 4:
            changeNavStackWidth(constant: 110, spacing: -10)
        case 5:
            changeNavStackWidth(constant: 95, spacing: -20)
        case 6...1000:
           // changeNavStackWidth(constant: 95, spacing: -20)
        default:
            print("default")
    
        }
        navigationItem.titleView = navStackView
        navStackView.layoutIfNeeded()
    }
    
    func changeNavStackWidth(constant: CGFloat, spacing: CGFloat) {
        navStackView.constraints.forEach { constraint in
            if constraint.firstAttribute == .width {
                constraint.constant = constant
                print("constan is:", constant) // not being printed
            }
        }
        navStackView.spacing = spacing
    } 
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        navStackView.subviews.forEach { $0.layer.cornerRadius = $0.frame.height / 2 }
     }
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   Sahil Manchanda    6 年前

    A) 如果只有一个图像 enter image description here B) 如果有两个图像: enter image description here C) 如果超过2个: enter image description here

    import UIKit
    
    class TestStack: UIViewController{
        var userImages = [#imageLiteral(resourceName: "images-1"),#imageLiteral(resourceName: "images-2"),#imageLiteral(resourceName: "images-4"),#imageLiteral(resourceName: "images-5")]
    
        let imagesHolder: UIView = {
            let v = UIView()
            v.translatesAutoresizingMaskIntoConstraints = false
            return v
        }()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            userImages.removeLast(2)
            guard let bar = navigationController?.navigationBar else {return}
            bar.addSubview(imagesHolder)
            let size = 25
            for i in 0..<userImages.count{
                var x = i * size
                x = userImages.count > 2 ? x/2 : x
                x = (i == 1 && userImages.count == 2) ? x + 5 : x
                let imageView = UIImageView(frame: CGRect(x: x, y: 0, width: size, height: size))
                imageView.image = userImages[i]
                imageView.clipsToBounds = true
                imageView.layer.cornerRadius = CGFloat(size / 2)
                imagesHolder.addSubview(imageView)
            }
    
            let width = CGFloat((userImages.count  * size)/2)
            NSLayoutConstraint.activate([
                imagesHolder.centerYAnchor.constraint(equalTo: bar.centerYAnchor),
                imagesHolder.centerXAnchor.constraint(equalTo: bar.centerXAnchor),
                imagesHolder.widthAnchor.constraint(equalToConstant: width),
                imagesHolder.heightAnchor.constraint(equalToConstant: CGFloat(size))
                ])
    
        }
    }
    
        2
  •  0
  •   BlondeSwan    6 年前

    不是调整StackView的宽度以适应图像:

    1. top bottom 使用UIView对UIImageView的约束
    2. 添加 center horizontally
    3. 添加 aspect ratio 约束,并将该比率设置为 1:1
    4. 将UIView添加到堆栈视图

        3
  •  0
  •   BlondeSwan    6 年前

    将imageView的内容模式更改为 .aspectFit

    改变这个 imageView.contentMode = .scaleAspectFill 为了这个 imageView.contentMode = .scaleAspectFit

    AspectFill 拉伸图像以适应视图,但不保持图像的比例 AspectFit 拉伸图像,直到水平边界或垂直边界碰到视图,同时保持图像的比例。

    看见 here