Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UILabel重新绘制视图。如何避免这种行为?_Ios_Objective C_Iphone_Uiview_Uilabel - Fatal编程技术网

Ios UILabel重新绘制视图。如何避免这种行为?

Ios UILabel重新绘制视图。如何避免这种行为?,ios,objective-c,iphone,uiview,uilabel,Ios,Objective C,Iphone,Uiview,Uilabel,我有一个带有三个子视图的viewController。 我还使用自动布局和大小类。 这些视图将设置动画并更改位置和大小。 在动画之后,我更新了一个标签,但是整个视图被重新绘制,所以每个视图都处于初始位置和大小。这不应该发生。 正如苹果开发者参考资料中所说: “UILabel类的默认内容模式为 UIViewContentModeRedraw。此模式导致视图重新绘制其 每次其边框更改时的内容。您可以更改 通过修改 阶级。” 我似乎不清楚如何修改-contentMode-以更新该标签并保持视图不变。有

我有一个带有三个子视图的viewController。 我还使用自动布局和大小类。 这些视图将设置动画并更改位置和大小。 在动画之后,我更新了一个标签,但是整个视图被重新绘制,所以每个视图都处于初始位置和大小。这不应该发生。 正如苹果开发者参考资料中所说:

“UILabel类的默认内容模式为 UIViewContentModeRedraw。此模式导致视图重新绘制其 每次其边框更改时的内容。您可以更改 通过修改 阶级。”

我似乎不清楚如何修改-contentMode-以更新该标签并保持视图不变。有人能给我一个线索吗?
提前感谢。

试试contentMode=ui查看contentmodecenter。这将防止您看到的重画。尽管这可能不是您想要的contentMode


选项2是使用CATextLayer绘制标签。它可以通过动画很好地调整大小,但设置起来要做的工作要多得多。

听起来您可能正在使用autolayout来布局视图(例如,通过IB中的约束),但随后您直接为动画操作视图的帧,是这样吗?如果是这样,则应改为设置约束的
常量
值的动画,或者可能设置子视图的
变换
s的动画

如果直接在使用“自动布局”的视图中操纵框架,则在下次系统布局视图时(例如,在标签的文本更改之后),您所做的更改将被重写

你有3个选择来克服你的问题-

  • 停止在故事板/Xib中使用自动布局

    这不是个好办法

  • 设置对子视图的
    transform
    属性所做更改的动画。e、 g.
    myView.transform=CGAffineTransformMakeScale(2.0,2.0)

    对于演示和动画非常有用,但在iOS 8.0之前,混合使用自动布局和转换会有一些问题

  • 为需要在动画中更改的约束添加约束。对这些约束的
    常量
    值的更改设置动画

    最健壮的方法,但可以为复杂动画生成大量属性和代码


  • 显示用于设置动画和更新动画的代码。问题不是设置标签或其层的动画。我遇到的问题是,只需更改label.text值,它就会重新绘制整个视图,并重置子视图的值(大小和位置)(我正试图避免)。作为记录,下一次我将使用CALayers。很抱歉我没有提到它,但是是的,我对主视图控制器(包括子视图)中的每一件事情都使用autolayout。然后,我在-viewwillreseact中设置了一些参数,在执行过程中,视图将执行一些动画,然后视图将不会重新绘制,直到我调用label.text=@“whatever”。谢谢你的提示:一定是关于常量的。。。你认为我应该以编程方式设置它们,而不是使用IB设置这些值吗?谢谢约翰。在你的动画中,你是直接设置画面的吗?如果是这样的话,那肯定是你问题的根源——请看我上面的答案。动画如下:[UIView animateWithDuration:tiempo delay:0选项:(UIView animationoptioncurvelinear)动画:^{vista1.frame=CGRectMake(V1x,V1y-160,80,140);vista2.frame=CGRectMake(V2x,V2y+160,80,140);}完成:^(BOOL finished){[UIView animateWithDuration:tiempo delay:0选项:UIView animationoption曲线动画:^{vista1.frame=CGRectMake(V2x,V1y-160,80,140);vista2.frame=CGRectMake(V1x,V2y+160,80140);…所以我的假设是正确的-您正试图在使用自动布局的视图中直接设置帧。您不应该这样做。您有3个选项可以解决您的问题,我将在我的答案中添加这些选项。方法不错!我正在研究第3个解决方案,但正如前面提到的,这将是一个很难编码的问题。我想如果我可以将新视图的大小和位置设置为默认值,因此重画不应该成为问题。我不确定这是否可行…但这将非常棒!再次感谢。