У меня есть UIScrollView. В этом я имею UIView, у которого есть кадр с отрицательным происхождением - мне нужно ограничить просмотр прокрутки, чтобы вы не могли прокручивать весь вид.
Я реализовал Zoom в этом scrollview.
Когда Масштабирование вида прокрутки отрегулирует размер представления Zoomable в соответствии с масштабом. НО ЭТО НЕ РЕГУЛИРУЕТ ПРОИСХОЖДЕНИЕ.
Итак, если у меня есть представление с фреймом {0, -500}, {1000, 1000}
Я уменьшаю масштаб до 0,5, это даст мне новый фрейм {0, -500}, {500, 500}
Ясно, что это не очень хорошо, весь вид увеличен из scrollview. Я хочу, чтобы кадр был {0, -250}, {500, 500}
Я могу немного поработать в методе scrollViewDidZoom, правильно отрегулировав исходное положение. Это работает, но зум не является гладким. Изменение места происшествия приводит к его переходу.
В документации для UIView я замечаю (относительно свойства frame):
Предупреждение. Если свойство преобразования не является преобразованием идентичности, значение этого свойства undefined, и поэтому его следует игнорировать.
Не совсем понятно, почему это так.
Я подхожу к этой проблеме неправильно? Каков наилучший способ его исправить?
Спасибо
Ниже приведен некоторый исходный код из тестового приложения, которое я использую:
В ViewController..
- (void)viewDidLoad
{
[super viewDidLoad];
self.bigView = [[BigView alloc] initWithFrame: CGRectMake(0, -400, 1000, 1000)];
[self.bigScroll addSubview: bigView];
self.bigScroll.delegate = self;
self.bigScroll.minimumZoomScale = 0.2;
self.bigScroll.maximumZoomScale = 5;
self.bigScroll.contentSize = bigView.bounds.size;
}
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
return bigView;
}
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
// bigView.frame = CGRectMake(0, -400 * scrollView.zoomScale,
// bigView.frame.size.width, bigView.frame.size.height);
bigView.center = CGPointMake(500 * scrollView.zoomScale, 100 * scrollView.zoomScale);
}
И затем в представлении...
- (void)drawRect:(CGRect)rect
{
// Drawing code
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(ctx, [UIColor whiteColor].CGColor);
CGContextSetStrokeColorWithColor(ctx, [UIColor whiteColor].CGColor);
CGContextFillRect(ctx, CGRectMake(100, 500, 10, 10));
for (int i = 0; i < 1000; i += 100) {
CGContextStrokeRect(ctx, CGRectMake(0, i, 1000, 3));
}
}
Обратите внимание на то, что здесь ожидание более заметно при больших масштабах масштабирования. В моем реальном приложении, где гораздо больше рисования и обработки происходит, прыжок становится все более очевидным во все времена.