我的应用程序的一部分中有一些相当复杂的图层,我希望它们进行栅格化,因为它们的内容变化接近于永远。这些图层所在的视图框架可以通过拖动" spacerbar来改变。用手指围着。 我制作了一个简单的测试应用程序来可视化我的问题并向您展示一些代码:
@interface ViewController () {
UIView* m_MainView;
UIView* m_TopView;
UIView* m_BottomView;
UIView* m_MidView;
int m_Position;
}
@end
@implementation ViewController
- (void)loadView {
m_MainView = [[UIView alloc] init];
m_TopView = [[UIView alloc] init];
m_TopView.backgroundColor = UIColor.blueColor;
m_TopView.translatesAutoresizingMaskIntoConstraints = false;
m_BottomView = [[UIView alloc] init];
m_BottomView.backgroundColor = UIColor.blueColor;
m_BottomView.translatesAutoresizingMaskIntoConstraints = false;
m_MidView = [[UIView alloc] init];
m_MidView.backgroundColor = UIColor.blackColor;
m_MidView.translatesAutoresizingMaskIntoConstraints = false;
[m_MainView addSubview:m_TopView];
[m_MainView addSubview:m_BottomView];
[m_MainView addSubview:m_MidView];
CALayer* targetLayer = [[CALayer alloc] init];
targetLayer.frame = CGRectMake (100, 200, 500, 50);
targetLayer.backgroundColor = UIColor.yellowColor.CGColor;
targetLayer.shouldRasterize = true;
[m_BottomView.layer addSublayer:targetLayer];
UIPanGestureRecognizer* recognizer = [[UIPanGestureRecognizer alloc]
initWithTarget:self action:@selector(handlePan:)];
[m_MainView addGestureRecognizer:recognizer];
m_Position = 400;
super.view = m_MainView;
}
- (void)handlePan:(UIPanGestureRecognizer*)sender {
float touchY = [sender locationInView:m_MainView].y;
m_Position = (int)touchY;
[m_MainView setNeedsLayout];
}
- (void)viewWillLayoutSubviews {
CGRect bounds = super.view.bounds;
m_TopView.frame = CGRectMake (0, 0, bounds.size.width, m_Position - 10);
m_MidView.frame = CGRectMake (0, m_Position - 10, bounds.size.width, 20);
m_BottomView.frame = CGRectMake (0, m_Position + 10, bounds.size.width,
bounds.size.height - m_Position - 10);
}
@end
现在......通过使用乐器并激活"颜色命中绿色和错过红色"可以看到何时重绘图层(然后以红色突出显示)。 在这个例子中,bar(targetLayer)大部分时间都是绿色(缓存),但是如果我开始拖动spacer(实际上改变了底部视图的框架),那么该层会变红一些......特别是如果我如果我慢慢拖动,则反转拖动的方向。 在我的应用程序中,这会导致闪烁,因为重绘这些图层非常昂贵。
为什么会这样? 我永远不会更改图层的任何属性,但它会重新绘制? 我确信我遗失了一些东西: - )
作为一种解决方法,我可以制作图层的快照并使用图像......我认为这是有效的,如果没有解决方案,我将不得不使用这种方法,但我想了解这里的问题是什么
任何?