Как вы переключаете не-полноэкранный UIView в супервизор с закругленными углами?

Я просматриваю UIViews, похожие на флип страницы приложения Weather. Однако взгляды не являются полноэкранными, а надстройка имеет закругленные углы. Проблема в том, что во время флип-анимации закругленные углы супервизора заполняются квадратными углами с черным.

Вот как я настраиваю углы:

self.view.layer.cornerRadius = 15.0f; self.view.clipsToBounds = YES; 

Вот как я просматриваю представления (как frontView и backView сохраняются):

 UIView *toView; UIView *fromView; UIViewAnimationOptions animationType; if (toFront) { toView = self.frontView; fromView = self.backView; animationType = UIViewAnimationOptionTransitionFlipFromLeft; } else { toView = self.backView; fromView = self.frontView; animationType = UIViewAnimationOptionTransitionFlipFromRight; } [UIView transitionFromView:self.fromView toView:self.toView duration:1 options:animationType completion:nil]; 

Когда я это self.view , круглые углы self.view заполняются черными. Можно ли этого избежать? Я не думаю, что достаточно знаю о Core Animation, чтобы решить эту проблему.

2 Solutions collect form web for “Как вы переключаете не-полноэкранный UIView в супервизор с закругленными углами?”

Если вам нужно сделать это в Core Animation, вы сделаете это, сделав анимацию отдельно от замены представлений. Это не трудно. Ниже описано, как это сделать и какой пример кода:

Замена взглядов

Замена представлений может быть выполнена, например:

 [UIView transitionFromView:self.fromView toView:self.toView duration:0.0 options:UIViewAnimationOptionTransitionNone completion:nil]; 

Анимация флип

Трудная часть – это, очевидно, анимация (и объединение обоих, если вы никогда этого не делали раньше).

Показывая только фронт обоих представлений

Поскольку вы хотите перевернуть два вида, как если бы они были двумя сторонами листа бумаги, вы не хотите, чтобы ни один из них не появлялся, когда они обращены в сторону. Это делается путем установки свойства doubleSided на NO на обоих слоях. (не будучи двусторонним, односторонним).

Создание флип

Вы хотите анимировать преобразование вида спереди из преобразования идентичности (без преобразования) в 180-градусное повернутое преобразование (обратное назад) вокруг оси y, так что оно переворачивается влево-вправо.

В то же время вы хотите оживить преобразование заднего вида с вращением -180 градусов в преобразование идентичности. Это откинет назад. Обе эти анимации могут быть выполнены как «базовые» анимации:

 CABasicAnimation *flipAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; [flipAnimation setFromValue:[NSValue valueWithCATransform3D:CATransform3DIdentity]]; // No rotation [flipAnimation setToValue:[NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 0,1,0)]]; // Rotate PI around Y [flipAnimation setFillMode:kCAFillModeBoth]; [flipAnimation setRemoveOnCompletion:NO]; [flippingView layer] addAnimation:flipAnimation forKey:@"myFlipAnimation"]; 

Затем вы делаете такую ​​же анимацию для другого вида. (Режим заполнения не позволяет анимации вернуться в исходное состояние после завершения)

Объединяя все это

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

 [CATransaction begin]; [CATransaction setAnimationDuration:2.0]; // 2 seconds [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; [CATransaction setCompletionBlock:^{ // Your view replacing code here... }]; // Add the animations to both views here... [CATransaction commit]; 

Вот что я написал. Кажется, что это нормально, но, конечно, проверьте его сами.

Что нужно отметить:

  • Перед вызовом этого метода вы должны добавить представление, которое вы анимируете TO.

  • Метод НЕ удаляет ни одно из видов, поэтому удалите их с блоком завершения, если это необходимо.

  • Этот метод также не изменяет значения «модели слоя» ваших представлений, поэтому они останутся такими же, как и после анимации.

`

 + (void)flipRight:(BOOL)flipRight fromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration completion:(void (^)(void))completionBlock { // Save original values BOOL fromViewDoubleSided = fromView.layer.doubleSided; BOOL toViewDoubleSided = toView.layer.doubleSided; BOOL fromViewUserInteractionEnabled = fromView.userInteractionEnabled; BOOL toViewUserInteractionEnabled = toView.userInteractionEnabled; // We don't want to see the other side of the layer fromView.layer.doubleSided = NO; toView.layer.doubleSided = NO; // We don't want user to fire off animation while its already going fromView.userInteractionEnabled = NO; toView.userInteractionEnabled = NO; [CATransaction begin]; [CATransaction setCompletionBlock:^{ // Restore original values fromView.layer.doubleSided = fromViewDoubleSided; toView.layer.doubleSided = toViewDoubleSided; fromView.userInteractionEnabled = fromViewUserInteractionEnabled; toView.userInteractionEnabled = toViewUserInteractionEnabled; if (completionBlock) completionBlock(); }]; CATransform3D flipOutTransform3D = CATransform3DMakeRotation(M_PI, 0,1,0); flipOutTransform3D.m34 = 1.0/(300.0*(flipRight ? -1 : 1)); CABasicAnimation *flipOutAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; flipOutAnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; flipOutAnimation.toValue = [NSValue valueWithCATransform3D:flipOutTransform3D]; flipOutAnimation.duration = duration; CATransform3D flipInTransform3D = CATransform3DMakeRotation(M_PI, 0,1,0); flipInTransform3D.m34 = 1.0/(300.0*(flipRight ? 1 : -1)); CABasicAnimation *flipInAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; flipInAnimation.fromValue = [NSValue valueWithCATransform3D:flipInTransform3D]; flipInAnimation.toValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; flipInAnimation.duration = duration; [fromView.layer addAnimation:flipOutAnimation forKey:@"flipOutAnimation"]; [toView.layer addAnimation:flipInAnimation forKey:@"flipInAnimation"]; [CATransaction commit]; }; 
  • Анимация UITableView изменяет размер
  • Свойства CALayer (например, тени) не отображаются на всех UITableViewCells
  • Как настроить пользовательский диспетчер Modal View, представляющий анимацию?
  • Как оживить цвет фона слоя UIView с помощью Facebook Pop Animation Framework?
  • Почему ни одна из моих анимаций не воспроизводится, когда вид, в котором они находятся, вызван из модального режима?
  • Как оживить градиент, перемещающийся на iOS
  • Рамка TextView видна, но не поддается отображению после анимации Swift 3
  • CALayer исчезает после воспроизведения CABasicAnimation назад
  • CATransaction поворачивает слой на 360 градусов странно
  • Изменение вкладки tabbarController программно с анимацией
  • Как я могу добавить элемент пользовательского интерфейса, добавленный через -addSublayer: отвечать на события касания?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.