3

スクロールに基づいてプロフィール画像を拡大縮小 (縮小) したい。しかし、重要なことは、中心点からではなく、右下の角度からスケーリングしたいということです。つまり、画像に示すように、右下の角度を固定し、画像を左端と上端から縮小する必要があります。

—————————————————
|               |
|    ———————————-    
|    |          |
|    |          |
|    |     —————|
|    |     |    |
|    |     |    |
—————————————————

これが私がしていることです。プロフィール写真の名前はimgVwProfilePic:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat offset = scrollView.contentOffset.y;
    CATransform3D avatarTransform = CATransform3DIdentity; 
    CATransform3D headerTransform = CATransform3DIdentity;

    viewHeader.alpha = 1.0;

    // PULL DOWN -----------------

    if(offset < 0)
    {
        CGFloat headerScaleFactor = -(offset) / CGRectGetHeight(viewHeader.bounds);
        int headerSizevariation = ((CGRectGetHeight(viewHeader.bounds) * (1.0 + headerScaleFactor)) - CGRectGetHeight(viewHeader.bounds))/2.0;
        headerTransform = CATransform3DTranslate(headerTransform, 0, headerSizevariation, 0);
        headerTransform = CATransform3DScale(headerTransform, 1.0 + headerScaleFactor, 1.0 + headerScaleFactor, 0);

        viewHeader.layer.transform = headerTransform;
    }

    // SCROLL UP/DOWN ------------

    else
    {
        CGFloat offset_HeaderStop = viewHeader.frame.size.height;
        headerTransform = CATransform3DTranslate(headerTransform, 0, MAX(-offset_HeaderStop, -offset), 0);

        float avatarScaleFactor = (MIN(offset_HeaderStop, offset)) / CGRectGetHeight(imgVwProfilePic.bounds) / 3.8; //1.4// Slow down the animation
        float avatarSizeVariation = ((CGRectGetHeight(imgVwProfilePic.bounds) * (1.0 + avatarScaleFactor)) - CGRectGetHeight(imgVwProfilePic.bounds)) / 2.0;

        avatarTransform = CATransform3DTranslate(avatarTransform, 0, avatarSizeVariation, 0);
        avatarTransform = CATransform3DScale(avatarTransform, 1.0 - avatarScaleFactor, 1.0 - avatarScaleFactor, 0);

        if(offset <= offset_HeaderStop){
            if(imgVwProfilePic.layer.zPosition < viewHeader.layer.zPosition){
                viewHeader.layer.zPosition = 0;
            }
        }

        else {
            if (imgVwProfilePic.layer.zPosition >= viewHeader.layer.zPosition){
                viewHeader.layer.zPosition = 2;
            }
        }
    }

    // Apply Transformations
    viewHeader.layer.transform = headerTransform;
    imgVwProfilePic.layer.transform = avatarTransform;
}

今、その画像ビューにアンカーポイントを設定する必要があることを知りました。しかし、どこに設置するかわかりません。に設定しましたviewDidLoadが、その画像ビューの元のフレームが変更されます。

- (void)viewDidLoad 
{
    imgVwProfilePic.layer.anchorPoint = CGPointMake(1, 1); // 1,1 for bottom right corner...
}
4

1 に答える 1

1

アンカー位置を設定する必要があることは正しいです (IIRC は、中心の相対 X および相対 Y 位置の範囲 [0.0,1.0] のスカラーのペアです)。

その後、レイヤーの「位置」属性(ひいてはビューの原点)がそのアンカー位置になるため、フレームを再調整する必要があります。オーバーライドしてみてください

- (void) setFrame:(CGRect)frame {
    CGPoint center = CGPointMake ( frame.origin.x+0.5*frame.size.width , frame.origin.y+0.5*frame.size.height ) ;
    viewHeader.layer.position = center ;
    CGRect bounds = CGRectMake ( 0,0 , frame.size.width,frame.size.height ) ;
    viewHeader.layer.bounds = bounds ;
}

そして、それを世話してもらいます。

于 2015-06-16T14:19:26.017 に答える