如何用Swift以编程方式增加UIView的高度

时间:2017-03-24 22:31:49

标签: ios swift xcode uiview constraints

在IB内部,我有一个带有segmentedControl和2个containerViews的viewController。在每个containerView中我都有一个tableView。从每个tableView我推送一个detailView。我的自动布局在IB中。

一旦我选择一个片段,我会看到相应的tableView,我选择一个单元格,并在场景中推送正确的detailView。

问题是一旦在segmentedControl上推送detailView仍然可见。我决定隐藏有效的segmentedControl,但那里有一个很大的空白空间。我试图以编程方式增加detailView的视图大小,但它没有扩展。从我读到的内容来看,因为我在故事板中做了初步约束。

如何以编程方式将detailView的视图展开?

代码:

DetailViewController: UIViewController{

override func viewDidLoad() {
        super.viewDidLoad()

 //this isn't increasing the view's size
 self.view.frame.size.height += 20.0

 //doesn't work. I get an error on the last argument
 self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height += 20.0)

 //doesn't work. I get an error on the last argument
 self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.size.height += 20.0)
 }

}

错误:

//Error for the last argument- height: *self.view.frame.height += 20.0*
self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height += 20.0)
  

变异操作员的左侧不可变:'身高'是一个只获得   属性

//Error for the last argument- *self.view.frame.size.height += 20.0*:
self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.size.height += 20.0)
  

无法为类型' CGRect'调用初始化程序。参数列表   type'(x:Int,y:Int,width:CGFloat,height:())'

6 个答案:

答案 0 :(得分:25)

您需要为详细视图的高度约束创建一个出口,然后您可以编程方式调整高度myHeightConstraint.constant += extraHeight,其中extraHeight是一个数字,表示您想要多高的细节看待。您也可能需要在之后致电self.view.layoutIfNeeded()

要从约束创建出口,请控制从情节提要编辑器中的约束(就像您对UIView的出口一样)拖动到您的代码中。

你是对的 - 因为你正在使用自动布局和约束,所以也需要使用约束进行调整。设置原始帧可能会导致意外行为。如果您有任何其他问题或困难,请告诉我。

答案 1 :(得分:10)

CGRect初始值设定项中,您不应该使用+=,只需+

变化:

self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height += 20.0)

为:

self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height + 20.0)

您不应该尝试在初始化程序中更改self.view.frame.height的值。

答案 2 :(得分:3)

对我来说,一种编程解决方案不需要我为可能要修改的每个高度约束创建一个出口。这是一个仅对我来说很好的仅代码解决方案。无论原始约束是在情节提要上还是以编程方式创建,它都应该起作用。如果需要的话,它还提供了一个使更改生效的选项-尽管我不确定如果视图嵌套在复杂的层次结构中是否可行。

extension UIView {
    func setHeight(_ h:CGFloat, animateTime:TimeInterval?=nil) {

        if let c = self.constraints.first(where: { $0.firstAttribute == .height && $0.relation == .equal }) {
            c.constant = CGFloat(h)

            if let animateTime = animateTime {
                UIView.animate(withDuration: animateTime, animations:{
                    self.superview?.layoutIfNeeded()
                })
            }
            else {
                self.superview?.layoutIfNeeded()
            }
        }
    }
}

答案 3 :(得分:1)

Swift 4.2

我以编程方式为您创建了一个示例:

 Card(
            shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.all(Radius.circular(10))),
            clipBehavior: Clip.antiAlias,
            child: IntrinsicHeight(
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: <Widget>[
                  Container(
                    color: Colors.orange,
                    width: 4,
                  ),
                  SizedBox(width: 5.0,),
                  Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      Row(
                        children: <Widget>[
                          Icon(Icons.alarm),
                          SizedBox(
                            width: 2,
                          ),
                          Text(
                            "Starts",
                            style: TextStyle(
                                fontFamily: "BarlowMedium", fontSize: 12),
                          ),
                          SizedBox(
                            width: 4,
                          ),
                          Text(
                            '11:30 AM',
                            style:
                                TextStyle(fontFamily: "BarlowBold", fontSize: 12),
                          ),
                          SizedBox(
                            width: 4,
                          ),
                          Text(
                            "to",
                            style: TextStyle(
                                fontFamily: "BarlowMedium", fontSize: 12),
                          ),
                          SizedBox(
                            width: 4,
                          ),
                          Text(
                            '1:30 PM',
                            style:
                                TextStyle(fontFamily: "BarlowBold", fontSize: 12),
                          )
                        ],
                      ),
                      SizedBox(
                        height: 4,
                      ),
                      Align(
                        alignment: Alignment.centerLeft,
                        child: Text(
                          'Design Studio 6 (Capstone)',
                          style: TextStyle(
                              fontFamily: "BarlowBold",
                              fontSize: 12,
                              color: Colors.blue),
                        ),
                      ),
                      SizedBox(
                        height: 4,
                      ),
                      Row(
                        mainAxisAlignment: MainAxisAlignment.start,
                        children: <Widget>[
                          CircleAvatar(
                            backgroundImage:
                                NetworkImage('https://placeimg.com/640/480/any'),
                            child: Image.asset("images/round_only.webp"),
                          ),
                          SizedBox(
                            width: 5,
                          ),
                          Column(
                            mainAxisAlignment: MainAxisAlignment.start,
                            children: <Widget>[
                              Align(
                                alignment: Alignment.centerLeft,
                                child: Text(
                                  "Faculty",
                                  style: TextStyle(fontFamily: "KohinoorDemi"),
                                ),
                              ),
                              SizedBox(
                                height: 3,
                              ),
                              Text(
                                'Meenal',
                                style: TextStyle(fontFamily: "BarlowBold"),
                              ),
                            ],
                          )
                        ],
                      ),
                      SizedBox(
                        height: 4,
                      ),
                      Row(
                        children: <Widget>[
                          Icon(Icons.business),
                          Text(
                            "Floor/Room",
                            style: TextStyle(fontFamily: "KohinoorDemi"),
                          ),
                          SizedBox(
                            height: 3,
                          ),
                          Text(
                            "6th Floor: North Wing / ISDI 606",
                            style: TextStyle(fontFamily: "BarlowBold"),
                          )
                        ],
                      ),
                    ],
                  )
                ],
              ),
            )),

这行代码创建一个按钮,并随动画改变按钮的高度。

希望此帮助:)

答案 4 :(得分:0)

是否为segmentedControl设置了任何高度限制,如果是这样,您可能希望在加载详细视图时删除它们

答案 5 :(得分:-1)

使用self.view.frame.size.height = 80