#iphone #uiscrollview #uiimageview #zooming
#iPhone #uiscrollview #uiimageview #масштабирование #просмотр пользовательского интерфейса
Вопрос:
У меня есть UIImageView внутри UIScrollView. Я хочу, чтобы пользователь мог увеличивать изображение и перемещаться по нему.
Это мой рабочий код:
//img is the UIImageView
//scroller is the UIScrollView
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
return img;
}
- (void)viewDidLoad {
[super viewDidLoad];
UIImage *image = [UIImage imageNamed:@"map_screen.png"];
img = [[UIImageView alloc] initWithImage:image];
scroller.delegate = self;
scroller.autoresizesSubviews = YES;
scroller.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
scroller.contentSize = img.frame.size;
scroller.scrollEnabled = YES;
scroller.directionalLockEnabled = NO;
scroller.userInteractionEnabled = YES;
CGSize ivsize = img.frame.size;
CGSize ssize = scroller.frame.size;
float scalex = ssize.width / ivsize.width;
float scaley = ssize.height / ivsize.height;
scroller.minimumZoomScale = fmin(1.0, fmax(scaley, scalex));
scroller.zoomScale = fmin(1.0, fmax(scalex, scaley));
[scroller addSubview:img];
img.userInteractionEnabled = YES;
}
все работает, но произошло вот что: минимальный масштаб — это высота экрана.
Ширина моего изображения больше высоты, поэтому я хочу, чтобы минимальный масштаб был равен ширине.
Если я напишу
scroller.minimumZoomScale = fmin(1.0, scalex);
работает, но когда пользователь уменьшает масштаб, изображение оказывается не в центре экрана, а вверху.
я пробовал что-то подобное этому
CGPoint scrollCenter = [scroller center];
[img setCenter:CGPointMake(scrollCenter.x, scrollCenter.y)];
или
img.center = scroller.center;
но с этим решением изображение прокручивается не полностью, и если я уменьшу масштаб, оно снова останется в верхней части экрана, но не будет полностью видно!
Что я могу сделать, чтобы это исправить?
Ответ №1:
Вы должны сделать это вручную во время масштабирования, используя функцию делегирования scrollViewDidZoom … что-то вроде
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
// center the image as it becomes smaller than the size of the screen
CGSize boundsSize = scrollView.bounds.size;
CGRect frameToCenter = imageView.frame;
// center horizontally
if (frameToCenter.size.width < boundsSize.width)
{
frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width) / 2;
} else {
frameToCenter.origin.x = 0;
}
// center vertically
if (frameToCenter.size.height < boundsSize.height)
{
frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height) / 2;
} else {
frameToCenter.origin.y = 0;
}
imageView.frame = frameToCenter;
}
Ответ №2:
Быстрая версия ответа Бастиана 3.0, немного более краткая:
func scrollViewDidZoom(_ scrollView: UIScrollView) {
// center the image as it becomes smaller than the size of the screen
let boundsSize = scrollView.bounds.size
var frameToCenter = imageView.frame
// center horizontally and vertically
let widthDiff = boundsSize.width - frameToCenter.size.width
let heightDiff = boundsSize.height - frameToCenter.size.height
frameToCenter.origin.x = (widthDiff > 0) ? widthDiff / 2 : 0;
frameToCenter.origin.y = (heightDiff > 0) ? heightDiff / 2 : 0;
imageView.frame = frameToCenter;
}