2015-06-16 5 views
2

Я хочу масштабировать (снижать) изображение профиля на основе прокрутки. Но, главное, я хочу масштабировать его не от центральной точки, а от нижнего правого угла. Значит, что нижний правый угол должен быть установлен и изображение должно быть сжиматься от левого и верхнего края, как показано на картинке:Масштаб UIView не из центра, а из нижнего правого угла с использованием CATransform3DScale

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

Вот что я делаю. Фото называется 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... 
} 

Пожалуйста, дайте мне руководство.

Спасибо заранее!

ответ

1

Вы правы, что вам необходимо установить положение привязки (с помощью IIRC - это пара скаляров в диапазоне [0.0,1.0] для относительной-X и относительной позиции Y центра).

После этого атрибут «position» слоя (и, по прошествии времени, начало представления) будет 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 ; 
} 

И иметь это позаботиться об этом.

+1

но где я буду называть метод setFrame? – NSPratik

+2

Где угодно. – iAdjunct

+0

'imgVwProfilePic.layer.anchorPoint = CGPointMake (1, 1); imgVwProfilePic.layer.transform = avatarTransform; [imgVwProfilePic setFrame: imgVwProfilePic.frame]; ' – NSPratik

 Смежные вопросы

  • Нет связанных вопросов^_^