2

私は iOS で単純な FlipView を実装してきました: 2 つのサブビューを含む UIView で、一度に 1 つずつ表示され、クリックすると反転します。私はフリッピングをアニメーション化するために以下を使用しています。

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    @synchronized(self){
        if(!self.flipping){
            self.flipping = YES;
            UIView *toView = self.currentView == self.primaryView ? self.secondaryView : self.primaryView;            
            [UIView transitionFromView:self.currentView toView:toView duration:self.speed options:UIViewAnimationOptionTransitionFlipFromLeft|UIViewAnimationOptionCurveEaseInOut completion:^(BOOL finished) {
                [self.currentView removeFromSuperview];
                self.currentView = toView;
                self.flipping = NO;
            }];                
        }
    }
}

かなり簡単ですよね?

しかし、私を悩ませているのは、ビューが反転している間、反転されたコンテンツが暗くなることです. これは、明るい背景に対して表示されます。

まったく同じアニメーションを使用する解決策を誰かが知っていますが、暗くはありません(<=それは単語ですか?)

前もって感謝します !

PS:IOS 5以降をターゲットにしています。

4

2 に答える 2

0

私は成功し、ここで見つけたコードでインスピレーションを得ましたhttp://www.mycodestudio.com/blog/2011/01/10/coreanimation/ (そして、彼自身はhttp://www.mentalfaculty.com/からインスピレーションを得ました) mentalfaculty/Blog/Entries/2010/9/22_FLIPPIN_OUT_AT_NSVIEW.html )

とにかく、私がしていることは 2 つのビューの間を行き来します。

- (void)flip{
    @synchronized(self){
        if(!self.flipping){
            self.flipping = YES;

            UIView *bottomView = self.currentView == self.primaryView ? self.secondaryView : self.primaryView;
            CALayer *top = self.currentView.layer;
            CALayer *bot = bottomView.layer;

            CAAnimation *topAnimation = [self flipAnimationWithDuration:self.speed/2.0 forLayerBeginningOnTop:YES scaleFactor:1];
            CAAnimation *bottomAnimation = [self flipAnimationWithDuration:self.speed/2.0 forLayerBeginningOnTop:NO scaleFactor:1];

            CGFloat zDistance = 1500.0f;
            CATransform3D perspective = CATransform3DIdentity;
            perspective.m34 = -1. / zDistance;
            top.transform = perspective;
            bot.transform = perspective;

            topAnimation.delegate = self;
            [CATransaction setCompletionBlock:^{
                [top removeAllAnimations];
                [self.currentView removeFromSuperview];
                self.currentView = bottomView;
                [self addSubview:bottomView];

                [CATransaction setCompletionBlock:^{
                    self.flipping = NO;
                    [bot removeAllAnimations];
                }];
                [CATransaction begin];

                [bot addAnimation:bottomAnimation forKey:@"flip"];

                [CATransaction commit];
            }];
            [CATransaction begin];
            [top addAnimation:topAnimation forKey:@"flip"];

            [CATransaction commit];
        }
    }
}

-(CAAnimation *)flipAnimationWithDuration:(NSTimeInterval)aDuration forLayerBeginningOnTop:(BOOL)beginsOnTop scaleFactor:(CGFloat)scaleFactor
{
    // Rotating halfway (pi radians) around the Y axis gives the appearance of flipping
    CABasicAnimation *flipAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.y"];
    CGFloat startValue = beginsOnTop ? 0.0f : M_PI/2;
    CGFloat endValue = beginsOnTop ? -M_PI/2 : 0.0f;
    flipAnimation.fromValue = [NSNumber numberWithDouble:startValue];
    flipAnimation.toValue = [NSNumber numberWithDouble:endValue];

    // Shrinking the view makes it seem to move away from us, for a more natural effect
    // Can also grow the view to make it move out of the screen
    CABasicAnimation *shrinkAnimation = nil;
    if (scaleFactor != 1.0 ) {
        shrinkAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
        shrinkAnimation.toValue = [NSNumber numberWithFloat:scaleFactor];

        // We only have to animate the shrink in one direction, then use autoreverse to "grow"
        shrinkAnimation.duration = aDuration * 0.5;
        shrinkAnimation.autoreverses = YES;
    }

    // Combine the flipping and shrinking into one smooth animation
    CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
    animationGroup.animations = [NSArray arrayWithObjects:flipAnimation, shrinkAnimation, nil];

    // As the edge gets closer to us, it appears to move faster. Simulate this in 2D with an easing function
    animationGroup.timingFunction = [CAMediaTimingFunction functionWithName:beginsOnTop?kCAMediaTimingFunctionEaseIn:kCAMediaTimingFunctionEaseOut];
    animationGroup.duration = aDuration;

    // this really means keep the state of the object at whatever the anim ends at
    // if you don't do this then it reverts back to the original state (e.g. brown layer)
    animationGroup.fillMode = kCAFillModeForwards;
    animationGroup.removedOnCompletion = NO;

    return animationGroup;
}

2 つのビューの名前は primaryView と secondaryView です。任意のビュー (ImageView、テキスト ビューなど) を使用できます。

于 2013-02-07T13:56:22.570 に答える
0

最近、同様の症状の問題が発生し、特定のアクションをコミットするたびに、コード内の他の場所にサブビューを何度も追加していました。多分あなたは似たようなことをしていますか?タッチが終わったら、反転したコンテンツに何か他のことをしていますか? 問題がある場合は、追加されているサブビューを削除する必要があります

于 2013-02-06T18:26:48.453 に答える