(Масштаб) Увеличить UIView в точке - PullRequest
20 голосов
/ 27 марта 2011

Что-то, чего я не понимаю в трансформациях.Я хочу увеличить масштаб, чтобы сказать, что верхний правый угол UIView (основной вид).Я использую CGAffineTransformScale и пробовал как установить center / anchorPoint, так и CGAffineTransformMakeTranslation безрезультатно.

Я не могу понять, как правильно установить перевод, чтобы он увеличил этотбалл.

CGAffineTransform tr = CGAffineTransformScale(self.view.transform, 2, 2);

[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
            self.view.transform = tr;
            self.view.center = CGPointMake(480,0);

} completion:^(BOOL finished) {}];

Ответы [ 2 ]

34 голосов
/ 27 марта 2011

Вы устанавливаете центр обзора в верхнем правом углу.Это означает, что вы приближаетесь где-то к левому нижнему краю от центра.

Попробуйте это

CGAffineTransform tr = CGAffineTransformScale(self.view.transform, 2, 2);
CGFloat h = self.view.frame.size.height;
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
    self.view.transform = tr;
    self.view.center = CGPointMake(0,h);
} completion:^(BOOL finished) {}];

Это установит центр развернутого вида в левый нижний угол.Эффективное увеличение с фиксированным верхним правым углом.

Этот код не имеет жестко заданного значения высоты, что является немного более портативным (для iPad iPhone 5).

Вам нужносначала сохранить h перед установкой свойства transform, потому что после этого не следует полагаться на значение frame.

edit

это работает для любого масштаба s, используйте это:

CGFloat s = 3;
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s);
CGFloat h = self.view.frame.size.height;
CGFloat w = self.view.frame.size.width;
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
    self.view.transform = tr;
    self.view.center = CGPointMake(w-w*s/2,h*s/2);
} completion:^(BOOL finished) {}];

Чтобы заставить это работать для нижнего левого, используйте это:

CGFloat s = 3;
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s);
CGFloat h = self.view.frame.size.height;
CGFloat w = self.view.frame.size.width;
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
    self.view.transform = tr;
    self.view.center = CGPointMake(w*s/2,h-h*s/2);
} completion:^(BOOL finished) {}];

Чтобы заставить это работать для нижнего правого, используйтеэто:

CGFloat s = 3;
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s);
CGFloat h = self.view.frame.size.height;
CGFloat w = self.view.frame.size.width;
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
    self.view.transform = tr;
    self.view.center = CGPointMake(w-w*s/2,h-h*s/2);
} completion:^(BOOL finished) {}];

См. также: Как масштабировать (масштабировать) UIView для данного CGPoint

2 голосов
/ 09 ноября 2016

На случай, если кому-то все еще интересно, вот решение Swift 3.0, к которому я добавил возможность корректного исчезновения.

(я знаю, что отсутствуют два перечисления, но код все еще читабелен, и я думаю, что вы поймете концепцию)

func animateZoom(direction: ZoomDirection, type: ZoomType, duration: Double = 0.3, scale: CGFloat = 1.4) {
    var cx, cy: CGFloat
    var tr: CGAffineTransform = CGAffineTransform.identity

    if (type == .IN) { tr = self.transform.scaledBy(x: scale, y: scale) }

    let h: CGFloat = self.frame.size.height;
    let w: CGFloat = self.frame.size.width;

    if (type == .IN) {
        switch direction {
        case .LEFT_DOWN:
            cx = w*scale/2
            cy = h-h*scale/2
            break
        case .LEFT_UP:
            cx = w*scale/2
            cy = h*scale/2
            break
        case .RIGHT_UP:
            cx = w-w*scale/2
            cy = h*scale/2
            break
        case .RIGHT_DOWN:
            cx = w-w*scale/2
            cy = h-h*scale/2
            break
        }
    } else {
        cx = w/scale/2
        cy = h/scale/2
    }

    UIView.animate(withDuration: duration, delay: 0, options: [.curveEaseInOut], animations: {
        self.transform = tr
        self.center = CGPoint(x: cx, y: cy)
    }, completion: { finish in })
}
...