当成员堆栈视图不再显示时,如何动态调整UIView的高度?

时间:2016-07-06 05:56:31

标签: swift uiview uistackview layout-anchor

我是一般的超级新iOS开发和StackViews,需要帮助计算不显示堆栈视图的实例中的动态高度。根据我从服务器返回的内容,有些情况下不会显示某些元素。

然而,当我致电removeArrangedSubview时,该元素被移除但高度未动态调整。我该如何解决这个问题?

我想一起避免使用Interface Builder,只是以编程方式执行此操作。我一直在使用布局锚来约束。

这是我的代码。你可以放在游乐场看看它。

    //: Playground - noun: a place where people can play


import UIKit
import Foundation

let view = UIView(frame: CGRect(x: 0, y: 0, width: 800, height: 140))

let firstStackView = UIStackView(frame: CGRectZero)
//firstStackView.heightAnchor.constraintGreaterThanOrEqualToConstant(40).active = true
firstStackView.axis = .Vertical
firstStackView.alignment = .Fill
firstStackView.distribution = .EqualSpacing

let titleStackView = UIStackView(frame: CGRectZero)
titleStackView.axis = .Horizontal
titleStackView.alignment = .Fill
titleStackView.distribution = .Fill
titleStackView.spacing = 3
firstStackView.addArrangedSubview(titleStackView)

let productStackView = UIStackView(frame: .zero)
productStackView.axis = .Horizontal
productStackView.alignment = .Leading
productStackView.distribution = .Fill
productStackView.spacing = 3
firstStackView.addArrangedSubview(productStackView)
//firstStackView.removeArrangedSubview(productStackView)

let secondStackView = UIStackView(frame: CGRectZero)
//secondStackView.heightAnchor.constraintEqualToConstant(30).active = true
secondStackView.axis = .Horizontal
secondStackView.distribution = .EqualSpacing


let title = UILabel(frame: CGRectZero)
title.text = "test1"
title.textColor = .blackColor()
//labelOne.backgroundColor = .blueColor()
let size = title.sizeThatFits(CGSizeZero)
print("\(size)")
title.widthAnchor.constraintEqualToConstant(size.width).active = true
//labelOne.heightAnchor.constraintEqualToConstant(30).active = true
titleStackView.addArrangedSubview(title)


let assigneeLabel = UILabel(frame: CGRectZero)
assigneeLabel.text = "test2"
assigneeLabel.textColor = .blackColor()
//labelTest.backgroundColor = .redColor()
assigneeLabel.textAlignment = .Left
//labelTest.heightAnchor.constraintEqualToConstant(30).active = true
titleStackView.addArrangedSubview(assigneeLabel)

let actions = UIButton(type: .Custom)
//buttonOne.backgroundColor = .redColor()
actions.setTitle("some button", forState: .Normal)
actions.setTitleColor(.blackColor(), forState: .Normal)
titleStackView.addArrangedSubview(actions)


let productOne = UILabel(frame: CGRectZero)
productOne.text = "something1"
productOne.numberOfLines = 0
let productLabelSize = productOne.sizeThatFits(CGSizeZero)
productOne.widthAnchor.constraintEqualToConstant(productLabelSize.width).active = true
productOne.textColor = .blackColor()
//labelTwo.backgroundColor = .blueColor()
productStackView.removeArrangedSubview(productOne)
//productStackView.addArrangedSubview(productOne)


let productTwo = UILabel(frame: CGRectZero)
productTwo.text = "something2"
productTwo.numberOfLines = 0
//productTwo.heightAnchor.constraintEqualToConstant(30).active = true
productTwo.textColor = .blackColor()
//labelTwo.backgroundColor = .blueColor()
productStackView.removeArrangedSubview(productTwo)
//productStackView.addArrangedSubview(productTwo)


let labelThree = UILabel(frame: CGRectZero)
labelThree.text = "sometime"
//labelThree.heightAnchor.constraintEqualToConstant(30).active = true
labelThree.textColor = .blackColor()
//labelThree.backgroundColor = .blueColor()
firstStackView.addArrangedSubview(labelThree)


let descriptionView = UILabel(frame: CGRectZero)
descriptionView.text = "some description about something"
descriptionView.textColor = .blackColor()
//descriptionView.backgroundColor = .redColor()
secondStackView.addArrangedSubview(descriptionView)

let tagsView = UILabel(frame: CGRectZero)
tagsView.text = "some more things"
tagsView.textColor = .blackColor()
secondStackView.addArrangedSubview(tagsView)
secondStackView.trailingAnchor.constraintEqualToAnchor(tagsView.trailingAnchor).active = true


let stackView = UIStackView(arrangedSubviews: [firstStackView, secondStackView])
stackView.layoutMargins = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
stackView.layoutMarginsRelativeArrangement = true
stackView.axis = .Vertical
stackView.frame = view.bounds
stackView.distribution = .FillProportionally

view.addSubview(stackView)

删除元素之前:enter image description here

删除元素后:enter image description here

我希望这个差距消失,高度动态调整。

1 个答案:

答案 0 :(得分:0)

如果使用自动布局,则可以为视图的高度添加约束。

因此,对于初始设置,您可以执行以下操作:

class YourClass : UIViewController() {

   var heightConstraint = NSLayoutConstraint()

   func someMethod () {

    // load your View
    // get the height of view. 
    heightConstraint = yourView.heightAnchor.constraintEqualToConstant(height)
    self.view.addConstraint(heightConstraint)

   } 

   func deleteMemberStackView() {

     /// After deleting the member, get the new height of the view and do this
     self.view.removeConstraint(heightConstraint)
heightConstraint =  yourView.heightAnchor.constraintEqualToConstant(height)
     self.view.addConstraint(heightConstraint)

     UIView.animateViewDuration(0.3, completion: {
          self.view.layoutIfNeeded()
     })
   }

}