小编mpr*_*vat的帖子

从Swift初始化程序调用方法

假设我在Swift中有以下类(它有明显的问题)

class MyClass {
    let myProperty: String

    init() {
        super.init()
        self.setupMyProperty()
    }

    func setupMyProperty() {
        myProperty = "x"
    }
}
Run Code Online (Sandbox Code Playgroud)

这是过度简化,但我基本上试图将初始化委托myPropertysetupMyProperty()方法.这是我经常使用的模式来分解类的设置的不同部分.

但是当然,self在超级初始化程序运行之前我无法调用,并且在所有属性都已设置之前我无法运行超级初始化程序,因此我处于捕获状态22.最重要的是它setupMyProperty()不是被认为是初始化程序,myProperty无论如何都无法分配.

谁能告诉我如何在Swift中实现这种模式?

swift

36
推荐指数
3
解决办法
1万
查看次数

setNeedsDisplayInRect:导致整个视图更新

我正在开发一个使用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)

core-animation core-graphics ios

10
推荐指数
2
解决办法
5060
查看次数

SKPhysicsBody和[SKNode setScale:]

在我目前使用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)

在此输入图像描述

注意蓝色精灵(按比例缩小)如何位于红色精灵之上,但你可以告诉它的物理体仍然具有我告诉它的尺寸,并且它没有缩放.

很明显,缩小节点不会缩小物理体.所以我的问题是如果我必须手动完成它,我该怎么做呢?

我尝试在缩放时用一个合适的尺寸交换身体,但是如果旧的身体有关节等,那么事情会变得非常复杂......如果我能以某种方式扩展现有的身体,那就简单多了.

ios7 sprite-kit

8
推荐指数
4
解决办法
5315
查看次数

NSData的替代品已弃用dataWithContentsOfMappedFile

所以+(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)

mmap objective-c ios

5
推荐指数
1
解决办法
3069
查看次数

如何制作像iOS 7锁屏一样的圆形按钮

是否有预定义的小部件可以在iOS7中使用锁定屏幕的圆形按钮?我一直在寻找UIButton,但我找不到任何东西.所以他们不是UIButtons,或者我没有看到它,或者它们只是不存在而且我必须自己创建自定义按钮.

uikit ios7

3
推荐指数
1
解决办法
8362
查看次数