【问题标题】:Scale UIView not from center, but from bottom right corner using CATransform3DScale不是从中心缩放 UIView,而是使用 CATransform3DScale 从右下角缩放
【发布时间】:2015-09-01 09:56:38
【问题描述】:

我想根据滚动缩放(缩小)个人资料图片。但是,主要的是,我不想从中心点而是从右下角缩放它。意思是,右下角应该固定,图像应该从左和上边缘收缩,如图所示:

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

这就是我正在做的。头像命名为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...
}

【问题讨论】:

    标签: ios catransform3d catransformlayer


    【解决方案1】:

    你是对的,你必须设置锚点位置(IIRC 是一对在 [0.0,1.0] 范围内的标量,用于中心的相对 X 和相对 Y 位置)。

    之后,图层的“位置”属性(以及扩展视图的原点)将是 w.r.t。该锚点位置,因此您必须重新调整框架。您可以尝试覆盖

    - (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 ;
    }
    

    并让它负责处理。

    【讨论】:

    • 但是我将在哪里调用setFrame 方法?
    • imgVwProfilePic.layer.anchorPoint = CGPointMake(1, 1); imgVwProfilePic.layer.transform = avatarTransform; [imgVwProfilePic setFrame:imgVwProfilePic.frame];
    • (1,1) 的锚点是一个角。你想要一个锚点或 (0.5,0.5)(水平一半;垂直一半)
    • 具体来说,(1,1) 是右上角,除非你告诉图层翻转几何(我认为默认设置在所有 UIView 的支持层上)
    猜你喜欢
    • 1970-01-01
    • 2012-09-09
    • 2015-11-22
    • 2015-04-27
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    相关资源
    最近更新 更多