UIScrollView: как уложить текст/кнопки с сохранением их размера и местоположения?

Цель:
Есть картинка, со всевозможными подписями, кнопками и прочим. Хочу чтобы при приближении/удалении картинки размеры вспомогательных элементов сохранялись, при этом они оставались на месте.

Проблема:
Зумирование реализовал через UIScrollView, положил на него отдельный UIView, на котором лежит UIImageView и UIButton.

Подключаю делегата для UIScrollView, в делегатном методе viewForZoomingInScrollView отдаю тот самый отдельный вью. Итог: картинка кнопки также зумится, но остается на месте.
b100f72763bd4fbdb320e3cbc12f698e.gif

Если же выношу кнопку за пределы этой вьюшки, а кидаю просто на UIScrollView, то кнопка убегает.
fa656536981f4b139c30d1b805862789.gif

Кода для этого написано не то, чтобы много:
#import "SVTViewController.h"

@interface SVTViewController () <UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIView *contentView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation SVTViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
  self.scrollView.minimumZoomScale = 1;
  self.scrollView.maximumZoomScale = 20.0;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
  return self.contentView;
}

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale
{
  
}

@end


Оставлю ссылку на гит с тестовым проектом:
https://github.com/AlloyDev/UIScrollViewSubviewsSc...
  • Вопрос задан
  • 2482 просмотра
Решения вопроса 2
kaspartus
@kaspartus Автор вопроса
В итоге победил модифицировав вариант, где кнопки лежат на contentView и масштабируются вместе с самой картинкой(1 гифка).

Решение:
Подцепился через делегатный метод -(void)scrollViewDidZoom:(UIScrollView *)scrollView

Там делаю трансформацию:
btn.transform = CGAffineTransformMakeScale(1 / self.scrollView.zoomScale, 1 / self.scrollView.zoomScale);


Думал что будет лагать, проверил на 100 кнопках - все работает идеально на третьей доске.

p.s. обновил репу
Ответ написан
Комментировать
morozovdenis
@morozovdenis
вариант 1: ловите изменение scale и пересчитывайте координаты вспомогательных элементов

вариант 2: сделайте две одинаковые view на scrollview, на первой храните картинку зуммированую и зуммируйте её как вы это делаете сейчас, а на второй храните вспомогательные элементы, ловите изменение размеров той вьюхи с картинкой и меняйте в соответствии с этим размер второй вьюхи(с вспомогательными). при правильном autoresizing кода должно получиться не много
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы