Перерисовать подпредставления после увеличения UIScrollView - PullRequest
3 голосов
/ 16 декабря 2011

У меня есть UIScrollView с дочерним UIView (CATiledLayer) - тогда у меня есть еще несколько дочерних представлений этого представления (некоторые из которых являются UITextViews)

После масштабирования все становится нечетким.

Я прочитал различные статьи на эту тему, и все они, похоже, указывают на то, что я должен обработать scrollViewDidEndZooming, а затем «сделать какие-то вещи для преобразования, связываться с фреймом и настроить смещение контента».Пожалуйста, может кто-нибудь избавит меня от моих страданий и объяснит, как это должно работать.

Заранее спасибо ...

Ответы [ 2 ]

15 голосов
/ 14 июля 2012

У меня была похожая проблема, когда мне нужно было масштабировать текст. Мой не использовал CATiledLayer, так что это может или не может работать для вас. Я также не использовал ARC, так что если вам это нужно, вам также придется это настроить.

Решение, которое я придумал, состояло в том, чтобы установить методы UIScrollViewDelegate следующим образом:

// Return the view that you want to zoom. My UIView is named contentView.
-(UIView*) viewForZoomingInScrollView:(UIScrollView*)scrollView {
  return self.contentView;
}

// Recursively find all views that need scaled to prevent blurry text
-(NSArray*)findAllViewsToScale:(UIView*)parentView {
    NSMutableArray* views = [[[NSMutableArray alloc] init] autorelease];
    for(id view in parentView.subviews) {

        // You will want to check for UITextView here. I only needed labels.
        if([view isKindOfClass:[UILabel class]]) {
            [views addObject:view];
        } else if ([view respondsToSelector:@selector(subviews)]) {
            [views addObjectsFromArray:[self findAllViewsToScale:view]];
        }
    }
    return views;
}

// Scale views when finished zooming
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    CGFloat contentScale = scale * [UIScreen mainScreen].scale; // Handle retina

    NSArray* labels = [self findAllViewsToScale:self.contentView];
    for(UIView* view in labels) {
        view.contentScaleFactor = contentScale;
    }
}
1 голос
/ 19 июля 2013

Я столкнулся с той же проблемой, и приведенный выше код не работал для моего случая. Затем я следовал документации:

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

Раздел "Добавление подпредставлений" https://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/UIScrollView_pg/CreatingBasicScrollViews/CreatingBasicScrollViews.html

Я просто создал пустое представление и добавил свой CATiledLayer и все остальные подпредставления в это пустое представление. Затем добавили это пустое представление как единственное дочернее представление представления прокрутки. И это сработало как шарм. Что-то вроде этого:

- (void)viewDidLoad
{
    _containerView = [[UIView alloc] init];
    [_containerView addSubView:_yourTiledView];
    for (UIView* subview in _yourSubviews) {
        [_containerView addSubView:subview];
    }
    [_scrollView addSubView:_containerView];
}

-(UIView*) viewForZoomingInScrollView:(UIScrollView*)scrollView {
    return _containerView;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...