Область касания после анимации CALayer на подклассе UIButton - PullRequest
0 голосов
/ 29 марта 2011

У меня есть UIButton, который я подклассифицирую.Попытка создать класс, который дублирует кнопки AppStore «Купить сейчас».Я создаю стиль кнопки с 3 слоями.

При изменении размера кнопки, которую я использую:

[CATransaction begin];
[CATransaction setAnimationDuration:0.25];

CGSize size = [self.titleLabel.text sizeWithFont:[UIFont boldSystemFontOfSize:18]];
size.width = size.width + kPadding;

for(CALayer *la in self.layer.sublayers){       
    CGRect boundsRect = la.frame;
    float inset = boundsRect.size.width - size.width;       
    boundsRect.origin.x = boundsRect.origin.x+inset;
    boundsRect.size.width = size.width;
    la.frame = boundsRect;  
    [la layoutIfNeeded];
}

[CATransaction commit];

Это ведет себя отлично и выглядит великолепно, но область касания кнопки остается такой же, как исходный размер кнопки.Любая попытка изменить рамку \ границы кнопки или основного CALayer приводит к странному поведению, и область касания все еще кажется неправильной.

Я также анимирую изменение цвета с помощью CABasicAnimation.Является ли использование CALayer неправильным выбором?Что мне здесь не хватает?

1 Ответ

0 голосов
/ 03 апреля 2011

Довольно простое решение.Поскольку вы смещаете слои, чтобы анимация двигалась в определенном направлении, рамка кнопки больше не совпадает со слоями.

Чтобы решить проблему, после Анимация CALayer, я изменяю размер и смещаю кадр UIButton, а затем смещаю кадры CALayer обратно туда, где они принадлежат в кадре UIButton.Это было достигнуто с помощью setCompletionBlock на CATransaction.

[CATransaction setCompletionBlock:^{
    //Readjust button frame for touch area

    CGRect frameRect = self.frame;
    frameRect.origin.x = frameRect.origin.x - offset;
    frameRect.size.width = frameRect.size.width + offset;
    self.frame = frameRect;

    [CATransaction setDisableActions:YES];
    for(CALayer *layer in self.layer.sublayers){
        CGRect rect = layer.frame;
        rect.origin.x = rect.origin.x+offset;
        layer.frame = rect;
    }
    [CATransaction commit];

}];

. Обратите внимание, что CALayers имеют неявные анимации, поэтому вам необходимо отключить действия CALayer во вложенной CATransaction.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...