什么使UIView在滚动包含它的UIScrollView时重新调整为默认值?

时间:2016-07-15 04:11:41

标签: ios uiview uiscrollview

我创建了一个UIScrollView,它是水平滚动的。

在UIScrollView中,A UIView包含一个显示文本的UILabel和一个用于隐藏视图的UIButton。

当用户更改标签中的文字时,视图的宽度会发生变化,而按钮会保持其大小。

我希望UIView做的是在UIScrollView向左和向右滚动时保持其大小。但滚动时UIView会回到原来的大小。

下图显示了故事板的设置;默认情况下,两个矩形是UIViews和UILabel,每个都有一个“Label”文本。字母X是一个按钮。包含这两个的水平区域是UIScrollView。

enter image description here

下一个是我在模拟器中运行应用程序的场景。我以编程方式更改了这些UIViews的边框。这些文本是从我制作的菜单中选择的,UIViews的宽度随着UILabels的宽度的变化而变化。忽略为什么两个标签都有相同的文字;我没有处理第二个视图。即使只有一个UIView,情况也是如此。

enter image description here

当我将UIScrollView向右滚动时,会出现问题。这些UIViews的宽度恢复为故事板中设置的默认值。

enter image description here

选择菜单时会调用以下功能。对不起,这些friggin奇怪的变量名称

//selectedTextPrim, selectedTextSecn: String()
//result1Text, result2Text: UILabel
//result1, result2: UIView
//result1XBtn, result2XBtn: UIButton
func processAddResult(){
    result1Text.text = selectedTextPrim + " > " + selectedTextSecn
    result1Text.sizeToFit()
    result1.frame.size.width = result1Text.frame.size.width + 24
    result1XBtn.frame.origin.x = result1Text.frame.maxX

    result2.frame.origin.x = result1.frame.maxX + 8

    result2Text.text = selectedTextPrim + " > " + selectedTextSecn
    result2Text.sizeToFit()
    result2.frame.size.width = result2Text.frame.size.width + 24
    result2XBtn.frame.origin.x = result2Text.frame.maxX
//        print("\(result1Text.frame.size.height)")
}

代码是否需要更改?或者有没有办法通过在某个地方添加一些代码来管理它?

1 个答案:

答案 0 :(得分:2)

您的视图按自动布局约束定位。您可以直接设置框架(正如您所做),但下次系统执行布局过程时,自动布局将根据约束重置框架。

许多事情都可以触发布局传递。其中一个是更改视图的bounds。滚动视图滚动的方式是更改自己的bounds.origin。因此,每次滚动视图滚动时,它都会触发布局传递。在这些布局过程中,您直接对视图frame所做的任何更改都将重置为由自动布局约束决定的帧。

在这种情况下,您似乎希望每个标签自动调整大小以适合其文本。自动布局可以自动执行此操作。如果您没有对标签的大小设置任何其他约束,则自动布局将使用标签的intrinsicContentSize,标签每次设置标签的文本时都会自动设置。

然后,您希望每个背景矩形自动包围标签。您可以通过将矩形的边缘约束到标签的边缘(加上常量来提供填充)来实现此目的。然后自动布局将自动使矩形的框架跟随标签的框架。

如果您正确执行此操作,则必须在代码中更改事项是标签的文本。自动布局将负责调整标签和背景矩形的大小和重新定位。

您应该观看“Taking Control of Auto Layout in Xcode 5” from WWDC 2013