2

私は UICollectionView を使用しており、そのクラスをサブクラス化してカスタム UICollectionViewCell を定義しました。クラスの初期化子は、次のように 2 つのビューを定義します。

    [[NSBundle mainBundle] loadNibNamed:@"ProtelViewCellFlipped" owner:self options:nil];

    CATransform3D transform = CATransform3DMakeRotation(M_PI, 0, 1, 0);
    [flippedView.layer setTransform:transform];
    [flippedView setHidden:YES];
    [self addSubview:flippedView];

    [[NSBundle mainBundle] loadNibNamed:@"ProtelViewCell" owner:self options:nil];
    [self addSubview:selfView];
    [selfView.layer setZPosition:1];

ここで、flippedView は "ProtelViewCellFlipped" xib ファイルで定義されたビューであり、selfView は "ProtelViewCell" xib ファイルで定義されたビューです。ビュー階層は次のようになります: ビュー階層 http://massimomarra.altervista.org/gerarchia.png

問題は、反転されたビューが によって回転され (「selfView」ビューの反対側であるかのように)、CATransform3D非表示になることです。そして、それは大丈夫です、それは動作します。

ビューにはselfViewUIButton があります。ビューの右下隅にあります。そのボタンを押すと、このメソッドがトリガーされます。

- (void)infoButtonPressed:(UIButton *)sender
{
    NSString *animationKey = (selfView.layer.zPosition > flippedView.layer.zPosition)? @"forward" : @"backwards";
    CGFloat animationDuration = 0.3;

    if (selfView.layer.zPosition > flippedView.layer.zPosition)
        [self.layer removeAllAnimations];

    CABasicAnimation *rotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.y"];
    [rotation setValue:animationKey forKey:@"id"];
    rotation.toValue = [NSNumber numberWithFloat:M_PI];
    rotation.duration = animationDuration;
    rotation.removedOnCompletion = NO;
    rotation.fillMode = kCAFillModeForwards;
    [self.layer addAnimation:rotation forKey:animationKey];

    [self performSelector:@selector(flipLayers) withObject:nil afterDelay:animationDuration/2];
}

ビューselfがアニメーションで回転するようにします。また、アニメーション中に次のメソッドが呼び出されます。

- (void)flipLayers
{
    [selfView setHidden:!selfView.hidden];
    [flippedView setHidden:!selfView.hidden];

    [selfView.layer setZPosition:flippedView.layer.zPosition];
    [flippedView.layer setZPosition:(1-selfView.layer.zPosition)];
}

が見えるようにflippedViewなり (そして非表示になりselfView)、レイヤーの zPosition が よりも高くなりselfViewます。

だから今、私はflippedView目に見えるようになり、正しく表示されます。ボタンもありますが、彼のアクションをトリガーするには、別の位置をタップする必要があります:反転表示スキーム: 回転前にボタンが「あった」場所をタップする必要があります http://massimomarra.altervista.org/s03KRJAUk7C_nP3yTXb7TBQ.png

回転はビューのグラフィックを変更するだけで、コンテンツは変更しないようです。手伝ってくれませんか?

よろしくお願いします!

4

1 に答える 1

4

向きを変更する前に、ボタンをアイデンティティに戻します

このようなもの:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{

    oneButton.transform=CGAffineTransformIdentity;
}

理由はわかりませんが、機能しているようです

于 2012-12-06T15:40:06.483 に答える