iOS - UIView 不显示在 UIStackView 内

Posted

技术标签:

【中文标题】iOS - UIView 不显示在 UIStackView 内【英文标题】:iOS - UIView does not display inside UIStackView 【发布时间】:2016-08-10 18:38:51 【问题描述】:

我有一个UIStackView,它需要在其中一个堆栈中添加背景颜色,所以我在其中放置了一个UIView,但UIView 从未显示。 UIView 当前有一个子视图UILabel,但最终应该有另一个UIStackView。如果我将UILabel 显示为UIStackView 的直接子代,而不是UIView,则UILabel 会正确显示。那么,我的UIView 缺少哪些约束或错误?

                        let stack = UIStackView()
                        stack.axis = .Vertical
                        stack.alignment = .Leading
                        stack.distribution = .EqualCentering
                        stack.spacing = 0

                        let width = UIScreen.mainScreen().bounds.size.width

                        let frame = CGRect(x: 0, y: 0, width: width, height: 50)
                        let viewHolder = UIView(frame: frame)
                        viewHolder.backgroundColor = blueColor

                        //Needs a blue background
                        let name = UILabel()
                        name.text = nameText
                        name.textColor = yellowColor
                        name.backgroundColor = blueColor
                        name.font = UIFont.boldSystemFontOfSize(32.0)                        

                        let address = UILabel()
                        address.text = addressText

                        let dateTime = UILabel()
                        dateTime.text = calString

                        viewHolder.addSubview(name)
                        stack.addArrangedSubview(viewHolder)
                        stack.addArrangedSubview(address)
                        stack.addArrangedSubview(dateTime)

                        self.stackView.addArrangedSubview(stack)

运行时会产生这样的结果:

如果我从等式中删除 UIView,即:

                        let stack = UIStackView()
                        stack.axis = .Vertical
                        stack.alignment = .Leading
                        stack.distribution = .EqualCentering
                        stack.spacing = 0

                        let width = UIScreen.mainScreen().bounds.size.width

                        let frame = CGRect(x: 0, y: 0, width: width, height: 50)
                        let viewHolder = UIView(frame: frame)
                        viewHolder.backgroundColor = blueColor

                        //Needs a blue background
                        let name = UILabel()
                        name.text = nameText
                        name.textColor = yellowColor
                        name.backgroundColor = blueColor
                        name.font = UIFont.boldSystemFontOfSize(32.0)                        

                        let address = UILabel()
                        address.text = addressText

                        let dateTime = UILabel()
                        dateTime.text = calString

                        //viewHolder.addSubview(name)
                        stack.addArrangedSubview(name) //Add the label directly to the UIStackView
                        stack.addArrangedSubview(address)
                        stack.addArrangedSubview(dateTime)

                        self.stackView.addArrangedSubview(stack)

我得到:

我只需要蓝色部分在屏幕上伸展

【问题讨论】:

【参考方案1】:

所以,答案是,不要使用 UIStackView。使用内置的 UITableView 进行这种布局。

【讨论】:

您需要更新 UIView 的 intrinsicContentSize 以便 stackView 在水平拉伸之前知道它是初始帧。我猜你的 UIView 的 intrinsicContentSize 被返回为 0,0 导致这种行为。

以上是关于iOS - UIView 不显示在 UIStackView 内的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS SDK 中禁用 UIView/UIViewController 的“突出显示子视图”消息?

IOS/Objective-C:子视图的子视图不显示

iOS Objective C - 旋转回纵向后 UIView 无法正确显示

如何在 iOS 中使用 UIView 动画显示 UIView,如 UIAction 表?

UIView 使用自动布局调整大小,但在运行时获取其帧大小不正确 ios

在键盘上显示带有按钮的 UIView,例如在 Skype、Viber messengers(Swift、iOS)中