CALayer sublayerTransform и contentsScale не очень хорошо играют вместе - PullRequest
1 голос
/ 02 июля 2011

Я настроил несколько примеров слоев, подобных этому. Каждый слой сокращает содержание своих подслоев на 0.75.

CGColorRef color = [UIColor colorWithRed:1 green:0 blue:0 alpha:1].CGColor;
CGRect frame = CGRectMake(0, 0, 128, 128);

m_layer0 = [CATextLayer new];
m_layer0.string = @"0";
m_layer0.frame = frame;
m_layer0.sublayerTransform = CATransform3DMakeScale(0.75, 0.75, 0.75);
m_layer0.masksToBounds = NO;
m_layer0.foregroundColor = color; 

m_layer1 = [CATextLayer new];
m_layer1.string = @"  1";
m_layer1.frame = frame;
m_layer1.sublayerTransform = CATransform3DMakeScale(0.75, 0.75, 0.75);
m_layer1.masksToBounds = NO;
m_layer1.foregroundColor = color;

m_layer2 = [CATextLayer new];
m_layer2.string = @"    2";
m_layer2.frame = frame;
m_layer2.sublayerTransform = CATransform3DMakeScale(0.75, 0.75, 0.75);
m_layer2.masksToBounds = NO;
m_layer2.foregroundColor = color;

[m_layer0 addSublayer:m_layer1];
[m_layer1 addSublayer:m_layer2];

[m_hostView.layer addSublayer:m_layer0];

hostView - это подпредставление UIScrollView, и при увеличении я установил соответствующий коэффициент contentsScale для его подслоев, чтобы получить четкий вид.

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    [CATransaction begin];
    [CATransaction setDisableActions:YES];
    m_layer0.contentsScale = scale;
    m_layer1.contentsScale = scale;
    m_layer2.contentsScale = scale;
    [CATransaction commit];
}

При увеличении изображения создается следующее выходное изображение. image

Почему первый подслой отображается правильно, а подслой всего этого размытый?

1 Ответ

2 голосов
/ 14 июля 2011

Я открыл TSI на этом.Вот решение:

Проблема в том, что я масштабирую ось Z, а также оси X и Y, что заставляет слой выбрать более сложный путь рендеринга.Так что CATransform3DMakeScale(0.75, 0.75, 1.0) будет «правильным» способом сделать это.

Если вы действительно хотите включить глубину z в преобразованиях подслоев, вы должны установить значение m34, например:

CATransform3D thisIsHowYouEnable3DForALayer = CATransform3DIdentity; 
thisIsHowYouEnable3DForALayer.m34 = -1.0/kSomeCameraDistanceValue;
parentView.layer.sublayerTransform = thisIsHowYouEnable3DForALayer;    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...