假设我在Swift中有以下类(它有明显的问题)
class MyClass {
let myProperty: String
init() {
super.init()
self.setupMyProperty()
}
func setupMyProperty() {
myProperty = "x"
}
}
Run Code Online (Sandbox Code Playgroud)
这是过度简化,但我基本上试图将初始化委托myProperty
给setupMyProperty()
方法.这是我经常使用的模式来分解类的设置的不同部分.
但是当然,self
在超级初始化程序运行之前我无法调用,并且在所有属性都已设置之前我无法运行超级初始化程序,因此我处于捕获状态22.最重要的是它setupMyProperty()
不是被认为是初始化程序,myProperty
无论如何都无法分配.
谁能告诉我如何在Swift中实现这种模式?
我正在开发一个使用CoreGraphics进行渲染的绘画应用程序.我的问题是,对于性能,我试图将更新限制为仅更改的视图的某些部分.为此,我使用setNeedsDisplayInRect:,但有时视图会更新其整个内容,从而导致口吃.这在第3代iPad上尤其明显,但在模拟器和iPad2中也会出现较小程度的问题.我试图删除此行为.
为了展示这个问题,我使用Xcode中的模板创建了一个简单的"单视图"项目.创建了一个自定义UIView子类,我将其设置为xib文件中的视图控制器视图.
将此添加到UIViewController:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
// Asks that the view refreshes a smal rectangle
[self.view setNeedsDisplayInRect:CGRectMake(10, 10, 20, 20)];
}
Run Code Online (Sandbox Code Playgroud)
将其添加到MyView(我的自定义视图):
- (void)drawRect:(CGRect)rect
{
// Just log what is being updated
NSLog(@"%@", NSStringFromCGRect(rect));
}
Run Code Online (Sandbox Code Playgroud)
就是这样.如果我在第3台iPad(实际设备)上运行该应用程序,日志会显示该视图在其内容中不时重新绘制(非常频繁).这太令人沮丧了,我没有想法
更新:这是一些日志.它肯定会显示有时更新的完整视图.我试图让它完全停止,但无法想象如何...
2012-05-04 08:34:01.851 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.184 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.197 TestUpdateArea[45745:707] {{0, 0}, {320, 460}}
2012-05-04 08:34:30.215 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.226 TestUpdateArea[45745:707] {{10, 10}, {20, 20}}
2012-05-04 08:34:30.242 TestUpdateArea[45745:707] {{10, 10}, …
Run Code Online (Sandbox Code Playgroud) 在我目前使用SpriteKit的项目中,我有一堆精灵需要在不同时间独立地放大和缩小.问题是当我缩放节点时,物理体不会随之缩放,因此它会破坏物理学.这是我为了这个问题而放在一起的一个小例子:
CGSize objectSize = CGSizeMake(100, 100);
self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(0, 0, self.size.width, self.size.height)];
SKSpriteNode *n1 = [SKSpriteNode spriteNodeWithColor:[UIColor blueColor] size:objectSize];
n1.position = CGPointMake(self.size.width/2, 2*self.size.height/3);
n1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:objectSize];
n1.physicsBody.affectedByGravity = YES;
[self addChild:n1];
SKSpriteNode *n2 = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:objectSize];
n2.position = CGPointMake(self.size.width/2, self.size.height/3);
n2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:objectSize];
n2.physicsBody.affectedByGravity = YES;
[self addChild:n2];
[n1 setScale:0.5];
Run Code Online (Sandbox Code Playgroud)
注意蓝色精灵(按比例缩小)如何位于红色精灵之上,但你可以告诉它的物理体仍然具有我告诉它的尺寸,并且它没有缩放.
很明显,缩小节点不会缩小物理体.所以我的问题是如果我必须手动完成它,我该怎么做呢?
我尝试在缩放时用一个合适的尺寸交换身体,但是如果旧的身体有关节等,那么事情会变得非常复杂......如果我能以某种方式扩展现有的身体,那就简单多了.
所以+(id)dataWithContentsOfMappedFile :( NSString*)路径自iOS 5.0以来显然已被弃用.听起来像我应该避免使用它,但那么我应该使用什么呢?
我正在使用mmap来创建内存映射文件,并且它适用于iOS5,但是在iOS6中,出现问题是因为我在尝试更新或读取缓冲区时出现错误.
int fd = open(path, O_RDWR);
off_t offset = 0;
snapshotData = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset);
close(fd);
Run Code Online (Sandbox Code Playgroud) 是否有预定义的小部件可以在iOS7中使用锁定屏幕的圆形按钮?我一直在寻找UIButton,但我找不到任何东西.所以他们不是UIButtons,或者我没有看到它,或者它们只是不存在而且我必须自己创建自定义按钮.