gpt4 book ai didi

ios - 缩放 UIView 不是从中心,而是从右下角使用 CATransform3DScale

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:14:51 38 4
gpt4 key购买 nike

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

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

这是我正在做的。个人资料图片名为 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;
}

现在,我知道我必须为该 ImageView 设置 anchor 。但我不知道我会在哪里设置它。我在 viewDidLoad 中设置了它,但它改变了该 ImageView 的原始框架。

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

最佳答案

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

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

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

让它来处理。

关于ios - 缩放 UIView 不是从中心,而是从右下角使用 CATransform3DScale,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30869998/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com