我很困惑CGLayer和CALayer.它们看起来很相似,为什么还有单独的实现呢?什么之间的区别,以及兼容性,CGLayer和CALayer?
所以 - 我打开了"颜色错位图像",以提高我们的应用程序中的绘图性能.文件说明:
在源像素未与目标像素对齐的图像上放置洋红色覆盖
但我不知道黄色意味着什么.(有一个"彩色屏幕外渲染"选项,使用黄色..."颜色未对齐图像"也打开此选项吗?)
有人知道吗?
TIA
我目前正在实施一个CABasicAnimation动画CALayer transform属性.现在,虽然我是Core Animation的新手,但我已经能够收集各种博客和文章,例如objc.io,使用经常(错误的)推荐的方法来获取动画以坚持使用是非常糟糕的主意.fillMode和removedOnCompletion动画的属性.这种方法被很多人认为是不好的做法,因为它会在模型层和表示层之间产生差异,因此未来对其中一个层的查询可能与用户看到的不匹配.
相反,推荐的动画制作方法是在将动画添加到动画图层的同时更新模型图层.但是,我很难理解这是如何工作的.我的动画很简单,就像这样:
CATransform3D updatedTransform = [self newTransformWithCurrentTransform];
// Location 1
CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
transformAnimation.duration = 1;
transformAnimation.fromValue = [NSValue valueWithCATransform3D:self.layerBeingAnimated.transform]; // Does not work without this.
transformAnimation.toValue = [NSValue valueWithCATransform3D:updatedTransform];
// Location 2
[self.layerBeingAnimated addAnimation:transformAnimation forKey:kTransformAnimationKey];
// Location 3
Run Code Online (Sandbox Code Playgroud)
我已经指出了三个尝试使用代码更新模型层的位置
self.layerBeingAnimated.transform = updatedTransform;
Run Code Online (Sandbox Code Playgroud)
在位置1中,图层向右跳转newTransform并且不动画.在位置2中,图层完全按照我想要的方式从当前变换设置为动画newTransform.在位置3中,图层向右跳转newTransform,跳回到旧变换,从fromValue到newTransform正确动画,然后保持在newTransform.
这是什么交易?更新模型层的正确位置是什么?为什么这三个位置会产生不同的结果?
谢谢!
嗨,我正在寻找一个干净的解决方案,没有覆盖drawRect或类似的东西UIView,在视图的顶部创建一个圆角.我的主要问题是如果视图调整大小或类似的话,创建变量解决方案.有清洁的解决方案吗?Apple也是第一个表项目.做到这一点并不难.
我正在xCode5上将旧的iOS 5项目转换为iOS6.0,并且大多数警告和错误已经修复但是对于这个.有关如何重写代码以避免编译器警告的任何建议.
#define kBitsPerComponent 8
#define kBitmapInfo kCGImageAlphaPremultipliedLast
- (UIImage*)scaleToSize:(CGSize)size :(UIImage *)image
{
CGBitmapInfo bitmapInfo = kBitmapInfo;
size_t bytesPerRow = size.width * 4.0;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, size.width,
size.height, kBitsPerComponent,
bytesPerRow, colorSpace, bitmapInfo);
CGRect rect = CGRectMake(0.0f, 0.0f, size.width, size.height);
CGContextDrawImage(context, rect, image.CGImage);
CGImageRef scaledImageRef = CGBitmapContextCreateImage(context);
UIImage* scaledImage = [UIImage imageWithCGImage:scaledImageRef];
CGImageRelease(scaledImageRef);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
return scaledImage;
}
Run Code Online (Sandbox Code Playgroud)
代码提供警告隐式转换从枚举类型'枚举CGImageAlphaInfo'到不同的枚举类型'CGBitmapinfo'(又名)'枚举CGBitmapInfo')
如果有人可以帮助修改代码,我将非常感激.
如何只使用一次CGAffineTransformMake()加上math.h触发函数(如sin(),cos()等),围绕角度a的x,y点旋转进行Core Graphics仿射变换.没有其他CG电话.
这里的其他答案似乎是使用多个堆叠变换或多步变换来移动,旋转和移动,使用多个Core Graphics调用.这些答案不符合我的具体要求.
用纯色填充路径很容易:
CGPoint aPoint;
for (id pointValue in points)
{
aPoint = [pointValue CGPointValue];
CGContextAddLineToPoint(context, aPoint.x, aPoint.y);
}
[[UIColor redColor] setFill];
[[UIColor blackColor] setStroke];
CGContextDrawPath(context, kCGPathFillStroke);
Run Code Online (Sandbox Code Playgroud)
我想绘制渐变而不是纯红色,但我遇到了麻烦.我已经尝试了问题/答案中列出的代码:iPhone上的UIView和UILabels上的渐变
这是:
CAGradientLayer *gradient = [CAGradientLayer layer];
[gradient setFrame:rect];
[gradient setColors:[NSArray arrayWithObjects:(id)[[UIColor blueColor] CGColor],
(id)[[UIColor whiteColor] CGColor], nil]];
[[self layer] setMasksToBounds:YES];
[[self layer] insertSublayer:gradient atIndex:0];
Run Code Online (Sandbox Code Playgroud)
然而,这描绘了整个视图,它与渐变一起,掩盖了我的原始路径.
我总是使用CoreGraphics和CoreAnimation,我理解他们每个人如何自己工作,但不是那些必须与另一个人交谈时的边缘情况.我也明白UIViews是一个很好的包装器CALayer,CALayer渲染的所有重要部分,以及UIView基于触摸的响应性增加.
但是,到目前为止我所看到的所有问题都是从一方或另一方面解决问题,而不是它们之间的相互作用,特别是在CoreGraphics和CALayer.之间.
无论如何,我的问题是......
我的理解是,CALayer包装CoreGraphics方法来绘制自己,但是只执行一次,并且可以使用自身的快照直到无效.但是,这些绘图方法如何与该层的子图层相互作用?它们是独家的吗?
例如,当我有一个UIView具有子视图的情况时会发生什么,并且我重载了该drawRect方法?这对它的子图层的绘制有何影响?
将两者混合在同一个函数中是不是一个好主意?
另外,我只询问iOS,我知道Mac是一个不同的野兽(也有那些花哨的CIFilters,混蛋!).
以下是我事先研究过的一些相关问题:
core-graphics ×10
ios ×6
iphone ×3
calayer ×2
cocoa ×2
objective-c ×2
cglayer ×1
colors ×1
drawrect ×1
enums ×1
instruments ×1
math ×1
swift ×1
uicolor ×1
uiview ×1