2012-05-04 3 views
1

Я пытался получить преобразованный CGRect UIView в UIScrollView. Он отлично работает, если я не увеличил масштаб, но как только я увеличил масштаб, новый CGRect сдвинется. Вот код, который получил меня близко:ConvertRect учет UIScrollView zoom и contentOffset

CGFloat zoomScale = (scrollView.zoomScale);  
CGRect newRect = [self.view convertRect:widgetView.frame fromView:scrollView]; 
CGPoint newPoint = [self.view convertPoint:widgetView.center fromView:scrollView]; 

// Increase the size of the CGRect by multiplying by the zoomScale 
CGSize newSize = CGSizeMake(newRect.size.width * zoomScale, newRect.size.height * zoomScale); 
// Subtract the offset of the UIScrollView for proper positioning 
CGPoint newCenter = CGPointMake(newPoint.x - scrollView.contentOffset.x, newPoint.y - scrollView.contentOffset.y); 

// Create rect with the proper width/height (x and y set by center) 
newRect = CGRectMake(0, 0, newSize.width, newSize.height);  

[self.view addSubview:widgetView]; 

widgetView.frame = newRect; 
widgetView.center = newCenter; 

Я довольно уверен, что мой вопрос заключается в zoomScale - я, вероятно, следует модифицировать координаты х и у на основе значения zoomScale. Тем не менее, все, что я пробовал до сих пор, не увенчалось успехом.

ответ

9

я получил следующий ответ от пользователя Brian2012 на Девых форумах IOS:

Что я сделал:

  1. Создано UIScrollView, который охватывает основной вид контроллера представления.
  2. В представлении прокрутки поместите представление рабочего стола (стандартный UIView). Происхождение рабочего стола составляет 0,0, а размер больше, чем прокрутка, поэтому я мог бы прокручивать, не увеличивая сначала.
  3. Поместите некоторые виды виджетов (UIImageView) в рабочий стол в разных местах.
  4. Установите размер содержимого прокрутки в размере рабочего стола.
  5. Реализованный viewForZoomingInScrollView, чтобы вернуть представление рабочего стола в виде прокрутки.
  6. Поместите NSLogs в scrollViewDidZoom, чтобы распечатать рамку рабочего стола и один из видов виджетов.

То, что я узнал:

  1. Фрейм виджет никогда не изменяется от начального значения, которое я установил. Так, например, если виджет начался в позиции 108, 108 с размером 64x64, тогда кадр всегда отображается как 108,108,64,64 независимо от масштабирования или прокрутки.
  2. Каркас рабочего стола никогда не меняется. Я помещаю начало рабочего стола в 0,0 в виде прокрутки, и начало координат всегда сообщается как 0,0 независимо от масштабирования или прокрутки.
  3. Единственное, что меняется, - это размер кадра рабочего стола, а размер - только исходный размер, умноженный на zoomScale прокрутки.

Вывод:

Чтобы выяснить расположение виджета относительно системы координат главного вида контроллера представления, вы должны делать математику самостоятельно. В этом случае метод convertRect не делает ничего полезного. Вот пример кода

- (CGRect)computePositionForWidget:(UIView *)widgetView fromView:(UIScrollView *)scrollView 
{ 
    CGRect frame; 
    float scale; 

    scale = scrollView.zoomScale; 

    // compute the widget size based on the zoom scale 
    frame.size.width = widgetView.frame.size.width * scale; 
    frame.size.height = widgetView.frame.size.height * scale; 

    // compute the widget position based on the zoom scale and contentOffset 
    frame.origin.x = widgetView.frame.origin.x * scale - scrollView.contentOffset.x + scrollView.frame.origin.x; 
    frame.origin.y = widgetView.frame.origin.y * scale - scrollView.contentOffset.y + scrollView.frame.origin.y; 

    // return the widget coordinates in the coordinate system of the view that contains the scroll view 
    return(frame); 
} 
+2

Я очень смущаюсь о системе координат subView UIScrollView при увеличении UIScrollView. Есть ли какие-то документы, которые полностью объясняют это? – Yeung

Смежные вопросы