UIScrollView прокручивается слишком далеко после начального увеличения - PullRequest
5 голосов
/ 05 сентября 2011

Мой UIScrollView заполняется большим содержимым, а затем масштабируется с помощью «setZoomScale: animated», так что он помещается в рамку прокрутки.Вид отображается правильно уменьшенным и правильно расположенным в виде прокрутки.Тем не менее, пользователь может прокручивать содержимое вне (цвет фона прокрутки показывает).Кажется, что он может прокрутить до исходного размера контента (как если бы контент не был уменьшен).Как ни странно, после того, как пользователь в первый раз увеличил масштаб вручную, все работает нормально, и просмотр прокрутки снова ограничен размером контента.

Я искал в Интернете и просматривал документы и примеры Apple, но могне найти никого, имеющего ту же проблему.Примеры Apple, кажется, показывают то же самое, что и я.

Мой контент - это пользовательское представление, производное от UIView, чей CALayer заменен на CATiledLayer (как в примерах Apple).Рисунок, который я делаю сам в drawLayer: inContext:.

Вот фрагмент кода из MyScrollViewController:

- (void)loadView {
    CGRect frame = [UIScreen mainScreen].applicationFrame;
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame];
    scrollView.maximumZoomScale=1.0;
    scrollView.delegate = self;

    ... setup theContentView ...

    scrollView.contentSize = theContentView.bounds.size;
    scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20);
    [scrollView addSubview:theContentView];
    self.view = scrollView;

    double zoomScale = 0.5; // hardcoded for testing
    [scrollView setZoomScale:zoomScale animated:NO];
NSLog(@"zoomscale=%g contentview=%@ contentsize=%@", zoomScale, NSStringFromCGSize(theContentView.bounds.size), NSStringFromCGSize(scrollView.contentSize));

    [scrollView release];
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return theContentView;
}

Оператор NSLog показывает правильно установленные contentSize и zoomscale ...

Надеюсь, что-то очевидно, что мне не хватает ...

Ответы [ 2 ]

3 голосов
/ 24 сентября 2012

Я закончил настройку zoomScale на следующем цикле выполнения (вместо непосредственно из loadView), который работал:

- (void) loadView {
    CGRect frame = [UIScreen mainScreen].applicationFrame;
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame];
    scrollView.maximumZoomScale=1.0;
    scrollView.delegate = self;

    ... setup theContentView ...

    scrollView.contentSize = theContentView.bounds.size;
    scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20);
    [scrollView addSubview:theContentView];
    self.view = scrollView;

    // set the zoom level on the next runloop invocation
    [self performSelector:@selector(initialZoom) withObject:nil afterDelay:0];

    [scrollView release];
}

- (void) initialZoom {
    double zoomScale = 0.5; // hardcoded for testing
    UIScrollView *scrollView = (UIScrollView *) self.view;
    [scrollView setZoomScale:zoomScale animated:NO];
}

Другая возможность, предложенная Maverick1st, состоит в том, чтобы установить масштаб увеличения из viewDidAppear, а не из LoadView. Этот подход имеет дополнительное преимущество, заключающееся в том, что он показывает анимацию масштабирования, указывая пользователю, что представление начинается в увеличенном состоянии.

- (void) viewDidAppear {
    double zoomScale = 0.5; // hardcoded for testing
    UIScrollView *scrollView = (UIScrollView *) self.view;
    [scrollView setZoomScale:zoomScale animated:YES];
}
1 голос
/ 21 сентября 2011

Я новичок в этом, но вы можете попробовать вырезать подпредставления.Я создал представление прокрутки с помощью построителя интерфейса, и там в инспекторе атрибутов был флажок подпредставления клипа, так что я думаю, что вы должны сделать что-то подобное, только программно.Надеюсь, это поможет.

...