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 кода должно получиться не много
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы