Ios UILabel重新绘制视图。如何避免这种行为?
我有一个带有三个子视图的viewController。 我还使用自动布局和大小类。 这些视图将设置动画并更改位置和大小。 在动画之后,我更新了一个标签,但是整个视图被重新绘制,所以每个视图都处于初始位置和大小。这不应该发生。 正如苹果开发者参考资料中所说: “UILabel类的默认内容模式为 UIViewContentModeRedraw。此模式导致视图重新绘制其 每次其边框更改时的内容。您可以更改 通过修改 阶级。” 我似乎不清楚如何修改-contentMode-以更新该标签并保持视图不变。有人能给我一个线索吗?Ios UILabel重新绘制视图。如何避免这种行为?,ios,objective-c,iphone,uiview,uilabel,Ios,Objective C,Iphone,Uiview,Uilabel,我有一个带有三个子视图的viewController。 我还使用自动布局和大小类。 这些视图将设置动画并更改位置和大小。 在动画之后,我更新了一个标签,但是整个视图被重新绘制,所以每个视图都处于初始位置和大小。这不应该发生。 正如苹果开发者参考资料中所说: “UILabel类的默认内容模式为 UIViewContentModeRedraw。此模式导致视图重新绘制其 每次其边框更改时的内容。您可以更改 通过修改 阶级。” 我似乎不清楚如何修改-contentMode-以更新该标签并保持视图不变。有
提前感谢。试试contentMode=ui查看contentmodecenter。这将防止您看到的重画。尽管这可能不是您想要的contentMode
选项2是使用CATextLayer绘制标签。它可以通过动画很好地调整大小,但设置起来要做的工作要多得多。听起来您可能正在使用autolayout来布局视图(例如,通过IB中的约束),但随后您直接为动画操作视图的帧,是这样吗?如果是这样,则应改为设置约束的
常量
值的动画,或者可能设置子视图的变换
s的动画
如果直接在使用“自动布局”的视图中操纵框架,则在下次系统布局视图时(例如,在标签的文本更改之后),您所做的更改将被重写
你有3个选择来克服你的问题-
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个解决方案,但正如前面提到的,这将是一个很难编码的问题。我想如果我可以将新视图的大小和位置设置为默认值,因此重画不应该成为问题。我不确定这是否可行…但这将非常棒!再次感谢。