小编Dav*_*ist的帖子

使用drawRect中的Core Graphics绘制图像网格:

我的问题是:我有一个简单的块图像,我想制作一个网格.我在我的UIView中创建了一个CGPoints数组.然后我用了

blackImage = [UIImage imageNamed:@"black.png"];
Run Code Online (Sandbox Code Playgroud)

然后

- (void)drawRect:(CGRect)rect {
    for (int j = 0 ; j <= 11; j++)
    {
        for (int i = 0 ; i <= 7; i++) 
        {
            [blackImage drawAtPoint: (CGPointFromString([[self.points objectAtIndex:j] objectAtIndex:i]))];
        }
    }
    [whiteImage drawAtPoint:(CGPointMake((CGFloat)(floor((touchX+0.001)/40)*40), (CGFloat)(floor((touchY+0.001)/40))*40))];

    //  [whiteImage drawAtPoint:(CGPointMake(240.0, 320.0))];   
}
Run Code Online (Sandbox Code Playgroud)

其中TouchX和TouchY是用户触摸屏幕的CGPoints.所以我基本上在用户触摸的网格上显示不同的图像.

首先,问题是每次调用DrawRect时都会重绘整个屏幕.我希望能够保存状态(通过更改BOOL的数组?)并让用户在屏幕上拖动并更改多个图像.但是,当我在DrawRect之外时,我无法在UImage上使用"drawAtPoint"方法.(抛出错误).

无论如何,我开始研究CoreAnimation和Quartz文档,并且真的很困惑.我不确定我是否应该为每个砖块创建多个UIViews(似乎过多),或者是CALayers或CGLayers的网格......我认为这很简单,我想做什么......但我真的不明白图层,以及使用CALayer和CGLayer之间的区别.显然"所有UIViews都是层支持的"这是什么意思?

我对如何实现这一点感到很遗憾.我基本上想要在网格中交换图像,以便用户可以在屏幕上"绘制"并切换图像.


编辑

我尝试使用[self setNeedsDisplayinRect]实现此功能,并传入用户手指下的CGRect.然而,这仍然是在TouchesMoved中调用DrawRect,它给了我想要的效果,但在iPhone上却太慢了.使用CALayers是否有更有效的方法来实现相同的效果?我是Core Animation的新手,并不真正了解如何使用图层来解决这个问题.

iphone core-animation core-graphics objective-c

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

向单元格添加阴影会导致延迟滚动

所以我有一个有阴影的UIView:

[containerFrame.layer setShadowOffset:CGSizeMake(0, 1)];
[containerFrame.layer setShadowRadius:4.0];
[containerFrame.layer setShadowColor:[UIColor colorWithRed:34/255.f green:25/255.f blue:25/255.f alpha:1.0].CGColor];
[containerFrame.layer setShadowOpacity:0.4];
Run Code Online (Sandbox Code Playgroud)

有了这个,我的滚动FPS下降到20-30.移除阴影然后繁荣,我的FPS回到60并且滚动像黄油一样光滑.现在问题是我需要在这个盒子/容器视图周围有一个阴影效果.如何在不降低滚动速度的情况下实现这一目标?

iphone objective-c uiview ipad ios

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

nsdictionary中的块?

所以我将块动作存储到一个nsmutabledictionary中,然后当一个响应返回到websocket时调用它们.这会将异步请求转换为块语法.这是精简代码:

- (void)sendMessage:(NSString*)message responseAction:(void (^)(id))responseAction
{ 
    NSString *correlationID =  (NSString*)[[message JSONValue] objectForKey:@"correlationId"];

    [self.messageBlocks setObject:responseAction forKey:correlationID];

    NSLog(@"Sending message: %@", correlationID);
   [webSocket send:message];
}

- (void)webSocket:(SRWebSocket *)wsocket didReceiveMessage:(id)message;
{
    NSString *correlationID = (NSString*)[[message JSONValue] objectForKey:@"correlationId"];
    NSLog(@"Incoming message. CorrelationID: %@", correlationID);
    void (^action)(id) = nil;
    if (correlationID) {
        action = [messageBlocks objectForKey:correlationID];
        if (action) action([message JSONValue]);
        [messageBlocks removeObjectForKey:correlationID];
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:服务器使用随请求发送的correlationID进行响应.因此,每个响应都通过该ID链接到每个请求.

这完美,比我预期的更好.我的问题是以这种方式运行块是否安全?正在调用[messageBlocks removeObjectForKey:correlationID]; 足以将其从内存中删除.我记得pre-ARC,block_release是一个选项.

cocoa-touch nsmutabledictionary websocket ios objective-c-blocks

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

为什么自动布局中的CGAffineTransformRotate会改变动画视图?

我想使用以下代码旋转imageView:

[UIView animateWithDuration:.25 animations:^{
    self.imageView.transform = CGAffineTransformRotate(self.plusView.transform, M_PI_4);
}];
Run Code Online (Sandbox Code Playgroud)

有线的事情是:如果我在没有自动布局的情况下运行此代码,那么每件事情都可以.但是当使用自动布局时,图像视图会在旋转之前移动一个垃圾像素,为什么?

uiviewanimation ios

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

将半透明面膜添加到CALayer?

我试图让我的UIImageView的周围区域变暗,并留下一部分(我用我的面具定义).

现在我正在定义我的蒙版并设置我的imageView.layer.mask,但是不是使图像的其余部分变暗,而是将其完全删除.

我想要的效果类型示例: http://i.imgur.com/vVUiuyk.png

我得到的例子: http://i.imgur.com/5DTXo0S.png

参考文档提到掩码使用它的图层的alpha,所以我试图操纵蒙版的不透明度.然而,这似乎只影响我想要单独留下的部分的不透明度,而图像的其余部分仍然完全被切除.

谁能指出我做错了什么?谢谢.

这是我的代码:

CAShapeLayer *mask = [CAShapeLayer layer];
GMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, nil, 1052, 448);
CGPathAddLineToPoint(path, nil, 2, 484);
CGPathAddLineToPoint(path, nil, 54, 1263);
CGPathAddLineToPoint(path, nil, 56, 1305);
CGPathAddLineToPoint(path, nil, 380, 1304);
CGPathAddLineToPoint(path, nil, 1050, 1311);
CGPathCloseSubpath(path);
mask.path = path;
CGPathRelease(path);

//mask.opacity = 0.5; //doesn't affect the surrounding portion, only the cut out area.
self.imageView.layer.mask = mask;
Run Code Online (Sandbox Code Playgroud)

mask objective-c calayer cashapelayer ios

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

Apple Maps URL Scheme t =

我正在尝试使用Apple Maps在URL中设置地图类型,但它似乎并没有起作用.我能做些什么不同的事情?我这样做是通过&t=satellite在URL中指定类型,如下所示:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://maps.apple.com/?daddr=San+Francisco,+CA&saddr=%@,%@&t=satellite", LatitudeCurrentLocation, LongitudeCurrentLocation]]];
Run Code Online (Sandbox Code Playgroud)

纬度和经度是包含纬度和经度坐标的NSStrings.

如何在URL中设置may类型?

objective-c ios apple-maps

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

一段时间后,动画在iOS应用程序中消失

运行几分钟后,我的应用程序中的所有动画都消失了,甚至系统动画如警报动画和UINavigationController动画也消失了.可能是什么问题?

PS我不会[UIView setAnimationsEnabled]在任何地方使用.

core-animation objective-c ios ios7

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

在画布中反向剪裁

我想剪辑 html5 画布,以便我可以按照下图实现绘图结果。

我想实现剪辑路径,以便所有绘图仅在黑色区域执行。

在此处输入图片说明

html html5-canvas

5
推荐指数
2
解决办法
2630
查看次数

UITableView中的多个视频播放器,如在instagram中

使用Instagram或Facebook等多个视频播放器创建UITableView非常困难.我想创建一个tableview,其中每个单元格都有一个功能正常的视频播放器.MPMoviePlayerController一次只支持一个单元格.任何建议或指向教程都会有所帮助.谢谢

video-streaming uitableview ios ios7

5
推荐指数
0
解决办法
434
查看次数

Apple统一日志记录-如何获取文件名和行号

苹果的Unified Logging文档指出:

消息中不要包含符号信息或源文件行号。系统自动捕获此信息。

但是在控制台中,我看不到文件名,类名,函数名或行号。

我该如何记录在日志中?

macos logging ios

5
推荐指数
2
解决办法
462
查看次数