Tag: calayer

iOS:提高图像绘制的速度

我有一个图像序列,我想animation( UIImageView支持一些基本的animation,但它不足以满足我的需要)。 我的第一个方法是使用UIImageView并设置image属性时,图像。 这太慢了。 速度不佳的原因是由于图像的绘制(这令我感到惊讶,我认为瓶颈将会加载图像)。 我的第二种方法是使用通用的UIView并设置view.layer.contents = image.CGImage 。 这并没有明显的改善。 这两种方法都必须在主线程上执行。 我认为速度不佳是由于不得不将图像数据绘制到CGContext 。 我怎样才能提高绘图速度? 是否有可能在后台线程上的上下文?

在iOS上,为什么设置一个图层的sublayerTransform将自己变成像CATranformLayer一样?

众所周知,图层的zPosition只决定哪个图层覆盖哪个图层。 无论是10人还是1000人,都不会影响其地位。 也就是说,除非我们使用CATransformLayer来包含这些图层 ,那么这些图层的zPosition会影响图层的位置。 但是,在iOS 5.1.1中运行的以下代码确实使zPosition改变了图层的位置…您可以在新的Single View App中尝试它,并将以下代码添加到ViewController.m 。 如果layer2的zPosition从88改变到188 ,我们可以看到图层相应的移动。 所以没有CATransformLayer在代码中; 为什么会这样呢? (请引用Apple文档或任何参考)。 另外相关的是,如果行self.view.layer.sublayerTransform = transform3D; 更改为self.view.layer.transform = transform3D; 那么该zPosition将不会对该位置产生影响。 但根据苹果文档, transform和sublayerTransform transform仅在自我转换与否方面有所不同 : 两个图层属性指定了变换matrix: transform和sublayerTransform 。 由transform property指定的matrixtransform property应用于图层及其子图层相对于图层的anchorPoint 。 […]由sublayerTransform属性指定的matrix仅应用于图层的子图层,而不是图层本身。 所以很奇怪,为什么改变它会使self.view.layer像CATransformLayer 。 -(void) viewDidAppear:(BOOL)animated { CATransform3D transform3D = CATransform3DIdentity; transform3D.m34 = -1.0 / 1000; transform3D = CATransform3DRotate(transform3D, M_PI / 4, 0, 1, […]

CALayer优化?

我添加了几个CALayers作为UIView层的子图层。 每层的内容是从服务器下载的不同图像。 每个图层都从屏幕外移动到随机生成的位置。 图像数据是asynchronous下载的。 每个图像大约300×300或更小。 随机放置的结果是,这些层重叠,有些被上面的层遮挡。 这很好。 我正在删除层,因为他们变得完全从视图中使用这个问题的答案中的build议隐藏确定覆盖率的计算发生在一个单独的线程。 我有一个UIPanGestureRecognizer,允许用户拖动屏幕上的图层。 当添加的图层数量接近25-30并逐渐变差时,我遇到了性能问题。 animation变得波涛汹涌,常常完全不存在(新添加的图层只出现在最终位置)。 平移手势要么被忽略,要么导致选定图层的重新定位不连续。 我假设我正在杀死所有图层重叠的graphics处理器和另一个图层上面的animation? 有关如何提高性能的任何build议? 处理大量图层的最佳实践? 图层是否比以前添加的图层在单独的view.layer中开始animation更好? 谢谢!

带有GradientLayer的UIButton模糊图像并使渐变变暗

我有一个UIButton在这里,我想有一个渐变作为背景下的背景(具有透明背景的符号),但我面临着两个不同的问题。 第一个CAGradientLayer似乎叠加在图像的顶部,不pipe我怎么尝试添加它,完全模糊了图像。 其次梯度本身似乎变得很暗,就像button被禁用,事实并非如此。 这是我的代码: self.backButton = [[UIButton alloc] initWithFrame:CGRectMake(15, 35, 28, 28)]; [backButton addTarget:self action:@selector(goBack) forControlEvents:UIControlEventTouchUpInside]; [backButton setBackgroundColor:[UIColor clearColor]]; CAGradientLayer *buttonGradient = [CAGradientLayer layer]; buttonGradient.frame = backButton.bounds; buttonGradient.colors = [NSArray arrayWithObjects: (id)[[UIColor colorWithRed:.0 green:.166 blue:.255 alpha:1] CGColor], (id)[[UIColor colorWithRed:.0 green:.113 blue:.255 alpha:1] CGColor], nil]; [buttonGradient setCornerRadius:backButton.frame.size.width / 2]; [backButton.layer insertSublayer:buttonGradient atIndex:0]; [backButton setImage:[UIImage imageNamed:@"backarrow.png"] forState:UIControlStateNormal]; […]

在AVCaptureVideoPreviewLayer中精确剪裁捕获的图像

我有一个使用AV基础的照片应用程序。 我使用AVCaptureVideoPreviewLayer设置了一个预览图层,占用屏幕的上半部分。 所以当用户试图拍照时,他们只能看到屏幕的上半部分。 这样做效果很好,但是当用户真正拍摄照片时,我尝试将照片设置为图层内容,图像失真。 我做了研究,并意识到我需要裁剪图像。 我想要做的就是裁剪完整的图像,以便所有剩下的东西正是用户最初在屏幕上半部分看到的。 我已经能够做到这一点,但我通过input手动CGRect值来做到这一点,它仍然看起来不完美。 必须有一个更简单的方法来做到这一点。 在过去的两天里,我已经翻阅了关于裁剪图像的每一篇文章,并没有任何工作。 必须以编程方式裁剪捕获的图像,以便最终图像与预览图层中最初看到的图像完全一致。 这是我的viewDidLoad实现: – (void)viewDidLoad { [super viewDidLoad]; AVCaptureSession *session =[[AVCaptureSession alloc]init]; [session setSessionPreset:AVCaptureSessionPresetPhoto]; AVCaptureDevice *inputDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; NSError *error = [[NSError alloc]init]; AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:&error]; if([session canAddInput:deviceInput]) [session addInput:deviceInput]; CALayer *rootLayer = [[self view]layer]; [rootLayer setMasksToBounds:YES]; _previewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:session]; [_previewLayer setFrame:CGRectMake(0, […]

从视图中删除所有subLayers

在animation中,我在视图中添加了很多子图层 ,其中包括: [self.view.layer addSublayer:layer1]; [self.view.layer addSublayer:layer2]; …. 我想通过一个动作去除所有的子层。 我已经尝试了一个类似问题的build议: rootLayer.sublayers = nil; 但它不工作… 你可以帮帮我吗? 比你!

UIVIEW和CALayer关于iOS背景图片的关系

试图了解UIView和CALayer之间的关系。 我读过苹果文档,但没有详细描述两者之间的关系。 为什么当我添加背景图像来查看“customViewController.view”,我得到了图像不需要的黑色。 而当我添加背景图像到图层“customViewController.view.layer”,图像的黑色区域消失(这是我想要的),但背景图像翻转颠倒。 这是为什么? 如果我要添加标签/视图/button/等。 到视图,图层的背景图像会阻止它们,因为CAlayer是由UIView支持的? 当你设置UIView的背景颜色时,它会自动设置相关图层的背景颜色? – (void)viewDidLoad { [super viewDidLoad]; customViewController = [[CustomViewController alloc] init]; customViewController.view.frame = CGRectMake(213, 300, 355, 315); customViewController.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"login_background.png"]]; // customViewController.view.layer.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"login_background.png"]].CGColor; [self.view addSubview:customViewController.view]; } 背景图像: – (void)viewDidLoad { [super viewDidLoad]; customViewController = [[CustomViewController alloc] init]; customViewController.view.frame = CGRectMake(213, 300, […]

使用“自动布局”垂直和水平居中自定义UIView

我正在尝试使用自动布局API新build可用的iOS 6来构build一个相当简单的animation自定义用户界面。我正在构build的自定义视图有一个圆形,我想要以垂直和水平为中心。 不幸的是,我不明白为什么我的约束似乎对UIButton和UILabel元素工作正常,但当我使用自定义视图和自定义CALayer(在这种情况下是一个圆圈,最终将animation),会产生奇怪的结果。 为了清楚起见,我不希望我的视图扩大到填满整个屏幕,而是要有dynamic的“填充”,使视图垂直居中在iPhone 4和5上。我还应该注意到,我很新cocoa和UIKit。 RootViewController.m: … – (void)viewDidLoad { [super viewDidLoad]; // Create Circle View CGRect circle_view_rect = CGRectMake(0, 0, 100, 100); UIView *circle_view = [[UIView alloc] initWithFrame:circle_view_rect]; // Create Circle Layer CircleLayer *circle_layer = [[CircleLayer alloc] init]; circle_layer.needsDisplayOnBoundsChange = YES; circle_layer.frame = circle_view.bounds; [circle_view.layer addSublayer:circle_layer]; // Enable Auto Layout [circle_view setTranslatesAutoresizingMaskIntoConstraints:NO]; [self.view addSubview:circle_view]; […]

CALayer Antialiasing不如UIView抗锯齿

我一直在试图使用CALayeranimation圆形图。 这一切运作良好,但问题是 – 绘制的圈不足够antialiased。 它有一些粗糙的边界(如果使用光栅化,则会模糊)。 (AntiAliasing已启用) 也试过: edgeAlliiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge; 无济于事。 下面是一个没有光栅化的例子: 这里是一个光栅化的例子:(尝试从1.0到4.0的值(只是为了确定结果 – 相同)) 这里是同一个圆圈,但是绘制在UIView中: 你可以看到,用UIView drawrect绘制的圆看起来好多了。 我不能使用UIView的原因是因为我需要animation圈填充。 使用CALayer是很容易的,但是在UIView上做同样的事情,我真的不知道它是否可能。 (我可以尝试启动drawrect:每1/60秒,但我认为它会变得迟缓,因为它不是这样的)。 所以 – 有没有人有任何解决scheme,我可以使CALayer绘制的圆圈/线看起来像绘制UIView?

如何在CALayer.contents中添加Stretchable UIImage?

我有一个CALayer,我想添加一个可拉伸的图像。 如果我只是这样做: _layer.contents = (id)[[UIImage imageNamed:@"grayTrim.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0.0, 15.0, 0.0, 15.0)].CGImage; 它将不起作用,因为图层的默认contentGravity是kCagravityResize。 我读过这可以使用contentsCenter来完成,但我似乎无法弄清楚我将如何使用它来实现CALayer中的拉伸图像。 任何想法都欢迎! 霍拉丘