Вместо sizeToFit, что я должен использовать
Я работаю над приложением, в котором основной вид заполняет весь экран. Этот основной вид содержит подпредставления, которые вы можете считать спрайтами. Они бродят, используя свой собственный код. Логика того, как они бродят, может заставить их бродить за кадром. То, что я хотел бы сделать, это изменить размер основного вида, чтобы он охватывал все подпредставления. Это действительно не размер представления, который изменяется, все же. Это масштабирование, которое меняется. Вроде как уменьшение масштаба карты Google. Как я могу это сделать? Это будет распознаватель жестов, который вызывает это.
1 ответ
Вы должны сделать это, используя трехуровневую иерархию представлений:
- вид верхнего уровня
- масштабированный вид
- вид спрайта 0
- спрайт вид 1
- вид спрайта 2
- и т.п.
- масштабированный вид
Установите границы масштабированного представления, чтобы охватить кадры всех представлений спрайтов. Затем установите преобразование масштабированного представления так, чтобы оно вписывалось в представление верхнего уровня.
- (void)updateBoundsAndTransformOfView:(UIView *)scaledView {
CGRect scaledBounds = CGRectNull;
for (UIView *spriteView in scaledView.subviews) {
scaledBounds = CGRectUnion(scaledBounds, spriteView.frame);
}
scaledView.bounds = scaledBounds;
// Now scaledView's size is large enough to contain all of its subviews,
// and scaledView's coordinate system origin is at the left edge of the
// leftmost sprite and the top edge of the topmost sprite.
UIView *topLevelView = scaledView.superview;
CGRect topLevelBounds = topLevelView.bounds;
CGFloat xScale =topLevelBounds.size.width / scaledBounds.size.width;
CGFloat yScale = topLevelBounds.size.height / scaledBounds.size.height;
CGFloat scale = MIN(xScale, yScale);
scaledView.transform = CGAffineTransformMakeScale(scale, scale);
scaledView.center = CGPointMake(CGRectGetMidX(topLevelBounds), CGRectGetMidY(topLevelBounds));
}