我的-drawInContext:方法中有一个包含一些复杂绘图代码的图层.我正在尝试最小化我需要做的绘图量,所以我使用-setNeedsDisplayInRect:仅更新已更改的部分.这是非常好的工作.但是,当图形系统更新我的图层时,它会使用交叉淡入淡出从旧图像过渡到新图像.我希望它能立即切换.
我已经尝试使用CATransaction来关闭操作并将持续时间设置为零,并且都不起作用.这是我正在使用的代码:
[CATransaction begin];
[CATransaction setDisableActions: YES];
[self setNeedsDisplayInRect: rect];
[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)
我应该使用不同的CATransaction方法(我也尝试过-setValue:forKey:使用kCATransactionDisableActions,结果相同).
我有一个类,它是一个子类UIView.我可以通过实现drawRect方法或通过实现drawLayer:inContext:哪个是委托方法在视图中绘制内容CALayer.
我有两个问题:
如果我实现drawLayer:inContext:,它被调用(并且drawRect不是,至少就断点可以告诉),即使我没有CALayer通过使用以下方式将我的视图指定为委托:
[[self layer] setDelegate:self];
如果我的实例未被定义为图层的委托,那么如何调用委托方法?什么机制可以防止drawRect被drawLayer:inContext:调用?
我有一个UIView,其图层将有子图层.我想为每个子图层分配代理,因此委托方法可以告诉图层要绘制什么.我的问题是:
作为CALayer的代表,我应该提供什么?文档说不要使用层所在的UIView,因为这是为视图的主CALayer保留的.但是,创建另一个类只是为了成为我创建的CALayers的代表,这就失去了不继承CALayer的目的.人们通常使用什么作为CALayer的代表?或者我应该只是亚类?
另外,为什么实现委托方法的类不必遵循某种CALayer协议?这是一个我不太了解的更广泛的首要问题.我认为所有需要实现委托方法的类都需要协议规范,以便实现者遵守.
我正在尝试为UIBezierPath制作动画,我已经安装了CAShapeLayer来尝试这样做.不幸的是,动画不起作用,我不确定任何层是否有任何影响(因为代码在我拥有图层之前做了同样的事情).
这是实际的代码 - 会喜欢任何帮助.Draw2D是UIView的一个实现,它嵌入在UIViewController中.所有绘图都在Draw2D类中进行.对[_helper createDrawing ...]的调用只是用点填充_uipath变量.
Draw2D.h定义了以下属性:
#define defaultPointCount ((int) 25)
@property Draw2DHelper *helper;
@property drawingTypes drawingType;
@property int graphPoints;
@property UIBezierPath *uipath;
@property CALayer *animationLayer;
@property CAShapeLayer *pathLayer;
- (void)refreshRect:(CGRect)rect;
Run Code Online (Sandbox Code Playgroud)
以下是实际实施:
//
// Draw2D.m
// Draw2D
//
// Created by Marina on 2/19/13.
// Copyright (c) 2013 Marina. All rights reserved.
//
#import "Draw2D.h"
#import"Draw2DHelper.h"
#include <stdlib.h>
#import "Foundation/Foundation.h"
#import <QuartzCore/QuartzCore.h>
int MAX_WIDTH;
int MAX_HEIGHT;
@implementation Draw2D
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization …Run Code Online (Sandbox Code Playgroud)