Один из самых сложных вещей, чтобы понять о масштабировании, что это всегда происходит вокруг точки, называемой Anchor Point. Я думаю, что лучший способ понять это - представить одну систему координат, наложенную поверх другой. Скажем, A - ваша внешняя система координат, B - внутренняя (B будет обзором прокрутки). Когда смещение B равно (0,0), а масштаб равен 1,0, то точка B (0,0) соответствует A (0,0), и в общем случае B (x, y) = A (x, y ).
Далее, если смещение B равно (xOff, yOff), то B (x, y) = A (x - xOff, y - yOff). Опять же, это все еще предполагает масштаб масштабирования 1,0.
Теперь, пусть смещение будет (0,0) снова и представьте, что происходит, когда вы пытаетесь увеличить изображение. На экране должна быть точка, которая не перемещается при масштабировании, а каждая другая точка движется наружу от этой точки. Это то, что определяет опорную точку. Если ваш якорь (0,0), то левая нижняя точка останется фиксированной, в то время как все остальные точки будут двигаться вверх и вправо. В этом случае смещение остается прежним.
Если ваша точка привязки равна (0,5, 0,5) (точка привязки нормализована, т. Е. От 0 до 1, так что 0,5 - это половина длины поперечного сечения), то центральная точка остается фиксированной, в то время как все остальные точки перемещаются наружу. Это означает, что смещение должно измениться, чтобы отразить это. Если он находится на iPhone в портретном режиме и вы увеличиваете масштаб до 2,0, значение точки привязки x переместится на половину ширины экрана, 320/2 = 160.
Фактическая позиция представления содержимого представлений прокрутки на экране определяется ОБА смещением и точкой привязки. Таким образом, если вы просто измените точку привязки слоев внизу, не внося соответствующее изменение в смещение, вы увидите, что вид, как кажется, прыгает в другое место, даже если смещение одинаковое.
Я предполагаю, что это основная проблема здесь. Когда вы анимируете масштабирование, Core Animation должна выбрать новую опорную точку, чтобы масштабирование выглядело правильно. Это также изменит смещение, так что фактическая видимая область на экране не переместится. Попробуйте регистрировать местоположение точки привязки в разное время на протяжении всего этого процесса (она определяется в базовом CALayer любого представления, к которому вы обращаетесь со свойством "layer" в представлениях).
Также, пожалуйста, смотрите документацию здесь для красивых картинок и, вероятно, гораздо лучшего описания ситуации, чем я дал здесь:)
Наконец, вот фрагмент кода, который я использовал в приложении, чтобы изменить опорную точку слоя без его перемещения на экране.
-(CGPoint)setNewAnchorPointWithoutMoving:(CGPoint)newAnchor {
CGPoint currentAnchor = CGPointMake(self.anchorPoint.x * self.contentSize.width,
self.anchorPoint.y * self.contentSize.height);
CGPoint offset = CGPointMake((1 - self.scale) * (currentAnchor.x - newAnchor.x),
(1 - self.scale) * (currentAnchor.y - newAnchor.y));
self.anchorPoint = CGPointMake(newAnchor.x / self.contentSize.width,
newAnchor.y / self.contentSize.height);
self.position = CGPointMake(self.position.x + offset.x, self.position.y + offset.y);
return offset;
}