【发布时间】:2017-02-21 10:07:09
【问题描述】:
我的主情节提要中有一个相当简单的设置:
- 包含三个视图的堆栈视图
- 第一个视图具有固定高度并包含一个段控制器
- 其他两个视图没有限制,其想法是一次只有一个处于活动状态,从而填满可用空间
我有如下代码来处理不断变化的视图活动视图:
import Foundation
import UIKit
class ViewController : UIViewController {
@IBOutlet weak var stackView: UIStackView!
@IBOutlet weak var segmentController: UISegmentedControl!
@IBAction func SegmentClicked(_ sender: AnyObject) {
updateView(segment: sender.titleForSegment(at: sender.selectedSegmentIndex)!)
}
override func viewDidLoad() {
updateView(segment: "First")
}
func updateView(segment: String) {
UIView.animate(withDuration: 1) {
if(segment == "First") {
self.stackView.arrangedSubviews[1].isHidden = false
self.stackView.arrangedSubviews[2].isHidden = true
} else {
self.stackView.arrangedSubviews[1].isHidden = true
self.stackView.arrangedSubviews[2].isHidden = false
}
print("Updating views")
print("View 1 is \(self.stackView.arrangedSubviews[1].isHidden ? "hidden" : "visible")")
print("View 2 is \(self.stackView.arrangedSubviews[2].isHidden ? "hidden" : "visible")")
}
}
}
As you can see, when the tab called 'First' is selected, the subview at index 1 should show, whilst 2 is hidden, and when anything else is selected, the subview at index 2 should show, whilst 1 is hidden .
如果我慢慢改变视图,这似乎一开始是有效的,但如果我走得快一点,索引 1 处的视图似乎在单击几下后永久隐藏,导致索引 0 处的视图覆盖整个屏幕。我在下面放置了一个显示问题的动画和故事板的屏幕截图。输出显示,当问题发生时,单击第一段时两个视图都保持隐藏状态。
谁能告诉我为什么会这样?这是一个错误,还是我没有做我应该做的事情?
非常感谢!
更新:我似乎能够通过按顺序转到第一个 > 第二个 > 第三个 > 第二个 > 第一段来可靠地重现该问题。
【问题讨论】:
-
你说你的另外两个视图没有“限制”你应该用约束来设置它们。然后,当您希望它们不显示在视图中时,请告诉它们隐藏。堆栈视图最酷的地方在于,当您告诉要隐藏其中的内容时,堆栈视图将重新调整以正确适应剩余的视图。
-
文本“First”实际上在您的动画底部可见,因此并未隐藏。您确定在段控件上设置了固定高度约束吗?
-
@phix23 固定高度位于堆栈视图的第一个子视图上,其中包含段控件。它设置为 height = 32。无论如何,我也尝试过从堆栈视图中进行,所以我不相信是这样。它还报告为对
print隐藏,因此它肯定认为它是隐藏的(除非我可能需要等待动画完成才能检查?)。 -
@zsteed 我的理解是,如果没有约束,视图应该自动填充堆栈视图?无论哪种方式,即使使用 0/0/0/0 约束,问题仍然存在。我相信这是因为代码由于某种原因无法取消隐藏第一个视图,但我不知道为什么。
-
我想是的,StackView 会在您显示和隐藏视图时自动处理。
标签: ios iphone swift uistackview