我有一个奇怪的问题,支持图层的NSView和它的兄弟姐妹,当添加到附加到旋转的超视图的现有视图层次结构中时,其中一些不能正确呈现.以下是详细信息.
- NSScrollView (layer can be here)
- NSClipView (or here)
- Document View (or even here)
- Some *rotated* subview
- { Problematic sublings }
Run Code Online (Sandbox Code Playgroud)
因此,层次结构本身相当简单和常见:带有一些文档的滚动视图,文档子视图代表一些内容.就我而言,它是图形内容,可以旋转.旋转视图可以有一些额外的子视图 - 各种标记,控制点等等,一旦我使用CALayer作为后端,我就会遇到偏斜图形的奇怪问题:

相机图片是单独渲染的,它们不是此视图树的一部分,请注意标记和按钮.
正如您在图像上看到的,我有一些带有子视图的测试视图(只是随机按钮).始终正确呈现右侧的对象.根据我的测试,每个NSView与frameRotation之间[0, pi/2]呈现OK.左侧的对象呈现模糊,看起来此项的缓存缓冲区太小.它发生在frameRotation在[pi/2, pi]范围内时.
在"实时轮换"中不会发生此问题.即如果我只是更改设置层次结构的frameRoation,每个子视图就在它的位置,一切正常.但是,当subling被添加到已经旋转的对象时 - 它会出现错误并给出这种模糊的外观.
在我的应用程序中,当用户点击项目时,会出现特殊子视图,即"兄弟姐妹被添加到超级视图中的那一刻".
看起来后端层有一些用于子视图的缓存缓冲区,其中一些在旋转根视图时使用错误的大小进行计算.
[view
setWantsLayer:YES]层次结构的根视图:滚动视图,剪辑视图,文档视图,每个结果都是相同的.没有手工制作的层,没有层主机.实际上,这就是问题所在.有人遇到过这样的问题吗?也许有人知道强制图层放弃所有缓存并完全更新的方法?到目前为止,我只有两个解决方案:要么完全放下图层(工作,也要转动所有的眼睛糖果),或者重新设置图层调用setWantsLayer:NO后跟setWantsLayer:YES.这个表现糟糕.
我很困惑CGLayer和CALayer.它们看起来很相似,为什么还有单独的实现呢?什么之间的区别,以及兼容性,CGLayer和CALayer?
我有一个UIView包含AVPlayer显示视频的内容.更改方向时,我需要更改视频的大小和位置.
我对调整图层大小没有经验,所以我在调整视频大小时遇到了问题.
我首先创建AVPlayer并将其播放器添加到我的videoHolderView的图层:
NSURL *videoURL = [NSURL fileURLWithPath:videoPath];
self.avPlayer = [AVPlayer playerWithURL:videoURL];
AVPlayerLayer* playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.avPlayer];
playerLayer.frame = videoHolderView.bounds;
playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
playerLayer.needsDisplayOnBoundsChange = YES;
[videoHolderView.layer addSublayer:playerLayer];
videoHolderView.layer.needsDisplayOnBoundsChange = YES;
Run Code Online (Sandbox Code Playgroud)
然后,稍后,我将更改videoHolderView框架的大小和位置:
[videoHolderView setFrame:CGRectMake(0, 0, 768, 502)];
Run Code Online (Sandbox Code Playgroud)
此时,我需要avPlayer调整大小到这些相同的维度.这不会自动发生 - avPlayer在videoHolderView中保持小尺寸.
如果有人可以提供帮助,我真的很感激任何建议.
多谢你们.
在动画中,我在视图中添加了许多子图层,其中:
[self.view.layer addSublayer:layer1];
[self.view.layer addSublayer:layer2];
Run Code Online (Sandbox Code Playgroud)
....
我想通过一个动作删除所有子图层.我已经尝试过这个类似问题的建议:
rootLayer.sublayers = nil;
Run Code Online (Sandbox Code Playgroud)
但它不起作用......
你可以帮帮我吗?比你!
每当我旋转一个有屏幕的屏幕时,我就会看到这种情况发生UITableView.我发现它发生在willRotate和我的同事之间的didRotate方法调用之间UIViewController也见过它在其他地方,通常在旋转周围.它直到最近才开始发生,我们对如何应对它感到困惑(谷歌搜索不会以错误的形式显示错误消息).有没有其他人遇到过这个知道怎么做的事情?
我目前正在实施一个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.
这是什么交易?更新模型层的正确位置是什么?为什么这三个位置会产生不同的结果?
谢谢!
我创建了一个文档视图,显示了角落里的页码.页码是具有半透明背景颜色的uilabel,并且具有角半径(使用s 的cornerRadius属性).我把它放在了上面.但是,这会使滚动生涩.如果我删除,性能是好的.我能做些什么吗?什么是更好的解决方案?它似乎是在没有任何性能问题的情况下实现的.viewlayerUIScrollViewcornerRadiusUIWebView
我必须添加一个UIImageView作为MapView的子视图.为此,我在MapView上创建了一个图层.在这一层,我想放置我的图像,但我得到一个白色的矩形,没有别的.我的图片不可见.
这是代码:
- (void)viewDidLoad
{
//......
CALayer *layer = [CALayer layer];
layer.backgroundColor = [[UIColor whiteColor] CGColor];
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
layer.bounds = CGRectMake(self.mapView.bounds.origin.x,
self.mapView.bounds.origin.y, 80, 300);
}
else
{
layer.bounds = CGRectMake(self.mapView.frame.origin.x,
self.mapView.frame.origin.y, 150, 700);
}
layer.contents = (id)[UIImage imageNamed:@"myImage.png"];
//the name is correct but in the output the image is not visible
[[self.mapView layer] addSublayer:layer];
[layer setNeedsDisplay];
}
Run Code Online (Sandbox Code Playgroud) 我想创造一枚落硬币.硬币图像是一个带有2个CABasicAnimations的CALayer - 一个掉落和一个旋转.当落下的动画结束时,它就会停留在那里.旋转动画虽然应该是随机的,但每次都以不同的角度结束,只会弹回原始的CALAyer图像.
我希望它保持在完成动画的角度.可能吗?我该怎么做?
码:
//Moving down animation:
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
anim.duration = 1;
anim.autoreverses = NO;
anim.removedOnCompletion = YES;
anim.fromValue = [NSNumber numberWithInt: -80 - row_height * (8 - _col)];
anim.toValue = [NSNumber numberWithInt: 0];
//Rotation Animation:
CABasicAnimation *rota = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
rota.duration = 4;
rota.autoreverses = NO;
rota.removedOnCompletion = NO;
rota.fromValue = [NSNumber numberWithFloat: 0];
rota.toValue = [NSNumber numberWithFloat: 2.5 * 3.15 ];
[cl addAnimation: rota forKey: @"rotation"];
[cl addAnimation: anim forKey: @"animateFalling"];
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我创建了一个CALayer(有几个子层 - CALayer由添加为子层的形状组成).
我正在尝试创建一个UIImage我将能够上传到服务器(我有这个代码).但是,我无法弄清楚如何添加CALayer到a UIImage.
这可能吗?