【问题标题】:3 views next to each other programmatically constraints3 个相邻的视图以编程方式约束
【发布时间】:2015-10-26 14:29:50
【问题描述】:

我正在尝试创建一个自定义 callOutView,为此我有一个 bubbleView,它是 UIView 在此视图中的子类,我想创建 3 个彼此相邻的视图。首先是imageView,其静态宽度和高度为 60。然后是 UIView,其动态宽度取决于 bubbleView 的总宽度。然后最后还有另一个具有静态高度和宽度的 imageView 再次为 60。我该如何实现这一点?我在下面尝试了snapKit,但似乎不起作用。

说明我想要什么

我尝试过的代码

        bubbleView = BubbleView()
        bubbleView?.clipsToBounds = true
        bubbleView?.layer.masksToBounds = true
        self.addSubview(bubbleView!)

        let logoImageView = UIImageView()
        logoImageView.contentMode = UIViewContentMode.ScaleAspectFill
        logoImageView.image = UIImage(data: logoImage!)
        bubbleView?.contentView.addSubview(logoImageView)
        logoImageView.backgroundColor = UIColor.whiteColor()

        let informationView = UIView()
        bubbleView?.contentView.addSubview(informationView)
        informationView.backgroundColor = UIColor.redColor()

        let discView = UIImageView()
        discView.contentMode = UIViewContentMode.ScaleAspectFill
        discView.image = UIImage(data: logoImage!)
        bubbleView?.contentView.addSubview(discView)
        discView.backgroundColor = UIColor.whiteColor()



        logoImageView.snp_makeConstraints { (make) -> Void in
            make.top.equalTo(bubbleView!).offset(0)
            make.left.equalTo(bubbleView!).offset(0)
            make.height.equalTo(60)
            make.right.equalTo(informationView)

        }

        informationView.snp_makeConstraints { (make) -> Void in
            make.top.equalTo(bubbleView!).offset(0)
            make.left.equalTo(logoImageView).offset(0)
            make.height.equalTo(60)
            make.right.equalTo(discView).offset(0)
        }

        discView.snp_makeConstraints { (make) -> Void in
            make.top.equalTo(bubbleView!).offset(0)
            make.left.equalTo(informationView).offset(0)
            make.height.equalTo(60)
            make.right.equalTo(bubbleView!)

        }

【问题讨论】:

  • 您没有在约束中设置宽度。将make.width.equalTo(60) 添加到您的图像视图中。

标签: ios swift uiview nslayoutconstraint


【解决方案1】:

你需要设置

  • leftViewrightView 的宽度限制等于 60。
  • middleView.leading 等于 leftView.trailing
  • middleView.trailing 等于 rightView.leading
  • all.height 等于 60。
  • all.top 等于 parent.top

您可以在 Playground 中尝试。

import UIKit
import XCPlayground

let parentView = UIView()

parentView.frame.size = CGSize(width: 450, height: 60)
parentView.backgroundColor = UIColor.whiteColor()

let leftView = UIView()
leftView.translatesAutoresizingMaskIntoConstraints = false
leftView.backgroundColor = .blackColor()

let rightView = UIView()
rightView.translatesAutoresizingMaskIntoConstraints = false
rightView.backgroundColor = .grayColor()

let middleView = UIView()
middleView.translatesAutoresizingMaskIntoConstraints = false
middleView.backgroundColor = .lightGrayColor()

// add subview
parentView.addSubview(leftView)
parentView.addSubview(middleView)
parentView.addSubview(rightView)

// config constraints
leftView.leadingAnchor.constraintEqualToAnchor(parentView.leadingAnchor).active = true
leftView.topAnchor.constraintEqualToAnchor(parentView.topAnchor).active = true
leftView.heightAnchor.constraintEqualToConstant(60).active = true
leftView.widthAnchor.constraintEqualToConstant(60).active = true

rightView.trailingAnchor.constraintEqualToAnchor(parentView.trailingAnchor).active = true
rightView.topAnchor.constraintEqualToAnchor(parentView.topAnchor).active = true
rightView.heightAnchor.constraintEqualToConstant(60).active = true
rightView.widthAnchor.constraintEqualToConstant(60).active = true

middleView.leadingAnchor.constraintEqualToAnchor(leftView.trailingAnchor).active = true
middleView.trailingAnchor.constraintEqualToAnchor(rightView.trailingAnchor).active = true
middleView.topAnchor.constraintEqualToAnchor(parentView.topAnchor).active = true
middleView.bottomAnchor.constraintEqualToAnchor(parentView.bottomAnchor).active = true

XCPlaygroundPage.currentPage.liveView = parentView

【讨论】:

    【解决方案2】:

    尝试以下方法:

        let bubbleView = UIView()
        bubbleView.translatesAutoresizingMaskIntoConstraints = false
    
        let logoImageView = UIImageView()
        logoImageView.translatesAutoresizingMaskIntoConstraints = false
        logoImageView.backgroundColor = .darkGrayColor()
        bubbleView.addSubview(logoImageView)
    
        let informationView = UIView()
        informationView.translatesAutoresizingMaskIntoConstraints = false
        informationView.backgroundColor = .lightGrayColor()
        bubbleView.addSubview(informationView)
    
        let discImageView = UIImageView()
        discImageView.translatesAutoresizingMaskIntoConstraints = false
        discImageView.backgroundColor = .darkGrayColor()
        bubbleView.addSubview(discImageView)
    
        let views = ["logoImageView": logoImageView, "informationView": informationView, "discImageView": discImageView]
    
        bubbleView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[logoImageView(60)][informationView][discImageView(60)]|", options: [.AlignAllBottom, .AlignAllTop], metrics: nil, views: views))
        bubbleView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[logoImageView(60)]|", options: [], metrics: nil, views: views))
    
        // helper constraint so that the information view is at least two times the imageviews' width
        bubbleView.addConstraint(NSLayoutConstraint(item: informationView, attribute: .Width, relatedBy: .GreaterThanOrEqual, toItem: logoImageView, attribute: .Width, multiplier: 2.0, constant: 0.0))
    
        view.addSubview(bubbleView)
        view.addConstraint(NSLayoutConstraint(item: bubbleView, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1.0, constant: 0.0))
        view.addConstraint(NSLayoutConstraint(item: bubbleView, attribute: .CenterY, relatedBy: .Equal, toItem: view, attribute: .CenterY, multiplier: 1.0, constant: 0.0))
    

    结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多