小编Sco*_*tle的帖子

将实例变量与Modern Runtime一起使用

我在Obj-c和Cocoa有几年的经验,但我刚刚回到它和Obj-C 2.0等的进步.

我正试图绕过现代运行时并声明属性等.让我感到困惑的一件事是现代运行时能够隐式创建iVar.当然,这意味着在您的代码中,您应始终使用self.property来访问该值.

但是,在init*和dealloc(假设您不使用GC)方法中,我们应该直接使用iVar(在当前运行时).

所以问题是:

  1. 我们应该使用init*中的属性访问器和使用Modern Runtime的dealloc吗?

  2. 如果是这样,为什么会有所不同?是不是因为编译器看不到iVar?

  3. 如果我需要覆盖一个访问器,我是否仍然可以访问将在运行时定义的iVar,或者我是否必须定义运行时将使用的实际iVar?

  4. 同样,如果我可以访问合成的iVar,为什么我不能继续为init*和dealloc方法执行此操作?

我多次阅读文档,但他们似乎对所有这些都有点模糊,我想确保我理解它以便决定如何继续编码.

希望我的问题清楚.


测试快速摘要:

  1. 如果你没有在遗产中声明ivar,编译器就完全不满意了

  2. 如果您#ifndef __OBJC2__在遗留编译器中使用ivar很高兴,您可以直接使用ivar和作为属性

  3. 在现代运行时,您可以将ivar保留为undefined并将其作为属性进行访问

  4. 在现代运行时,尝试直接访问ivar而不进行声明会在编译期间出错

  5. @private 当然,伊娃的宣言允许直接进入遗产和现代的伊塔尔

现在真的没有给出一个干净的方法吗?

macos objective-c objective-c-runtime

9
推荐指数
1
解决办法
1538
查看次数

UILabel动画框架流畅

我一直试图想出一个很好的方法来平滑地动画UILabel上的帧大小变化,而不需要一个奇怪的起始跳转重绘.默认情况下,当我做这样的事情时:

// Assume myLabel frame starts as (0, 0, 100, 200) 
[UIView beginAnimations:@"myAnim" context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDuration:1.0];
myLabel.frame = CGRectMake(0.0, 0.0, 50, 100);
[UIView commitAnimations];  
Run Code Online (Sandbox Code Playgroud)

我得到了一个带有标签的平滑动画,但是它的方式是它将重绘的图像层用于标签的目标大小,并将内容拉伸以适应当前的动画然后动画到目标矩形.这最终会在文本显示中出现非常奇怪的跳跃.这里有两个图像显示动画前的外观,然后在动画开始后:

预动画

后期动画

我试图仅使用图层来设置动画,但我仍然遇到同样的问题.

所以问题是,我该如何避免这种情况?

谢谢你的帮助,
斯科特

animation cocoa-touch uilabel

9
推荐指数
3
解决办法
7316
查看次数