Можно ли добавить фиксированный контент в UIScrollView? - PullRequest
14 голосов
/ 21 февраля 2012

Я хочу создать подкласс UITableView или UIScrollView, который будет иметь некоторое затенение в верхней части, когда смещение контента> 0, чтобы указать, что контент можно прокручивать.(См. Изображение в приложении) enter image description here

Я реализую это прямо сейчас, используя UIViewController, который является делегатом tableView.У меня просто GradientView поверх tableView, и я перехватываю scrollViewDidScroll:, чтобы оживить видимость этого верхнего градиента.

Моя проблема с этой реализацией заключается в том, что она не "чистая".Я хочу, чтобы мой UIViewControllers позаботился о логике, а не о применении градиентов и прочего.Я хотел бы просто отказаться от подкласса UITableView, который сделает это для меня.

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

Другой вопрос - какой метод / ы из UIScrollView следует переопределить, чтобы перехватить событие прокрутки.Очевидно, я не хочу, чтобы tableView был делегатом самого себя ...

Есть идеи?

Спасибо!

Ответы [ 4 ]

29 голосов
/ 21 февраля 2012

Хорошо, поэтому я нашел решение для видео Apple, посвященного WWDC 2011 Session 104 - Расширенные методы просмотра прокрутки.

В этом видео есть целый раздел о "Стационарных видах" внутри вида прокрутки.Согласно Apple, способ пойти сюда - это переопределить layoutSubviews и поместить туда весь код, чтобы расположить все, что вы хотите - где угодно.

Я попробовал это, и на самом деле это довольно просто, и он работает, как и ожидалось.

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

-(void) layoutSubviews
{
    [super layoutSubviews];
    [self positionTopShadow];
}

-(void) positionTopShadow
{
    CGFloat yOffset = self.contentOffset.y;
    // I'm doing some limiting so that the maximum height of the shadow view will be 40 pixels
    yOffset = MIN(yOffset, 40);
    yOffset = MAX(0, yOffset);

    CGRect frame = self.topShadowView.frame;
    // The origin should be exactly like the content offset so it would look like
    // the shadow is at the top of the table (when it's actually just part of the content) 
    frame.origin = CGPointMake(0, self.contentOffset.y);
    frame.size.height = yOffset;
    frame.size.width = self.frame.size.width;
    self.topShadowView.frame = frame;

    if (self.topShadowView.superview == nil)
    {
        [self addSubview:self.topShadowView];
    }
    [self bringSubviewToFront:self.topShadowView];
}
3 голосов
/ 30 сентября 2013

Мне удалось найти гораздо более простой способ, чем Авраам.

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

- (void)viewDidLoad {
    UIScrollView* scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(5.0, 50.0, self.bounds.size.width - 15.0, self.bounds.size.height - 60.0)];
    [scrollView setBackgroundColor:[UIColor colorWithRed:251.0/255.0 green:251.0/255.0 blue:251.0/255.0 alpha:1.0]];
    [scrollView setContentSize:CGSizeMake(scrollView.frame.size.width + 500, 1000.0)];
    [scrollView setDelegate:self];
    [self addSubview:scrollView];

    UIView* header = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, scrollView.contentSize.width, 40.0)];
    [header setTag:100];
    [header setBackgroundColor:[UIColor darkGrayColor]];
    [scrollView addSubview:header];
}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
    UIView* header = [self viewWithTag:100];
    [header setFrame:CGRectMake(0.0, scrollView.contentOffset.y, header.bounds.size.width, header.bounds.size.height)];
}
0 голосов
/ 05 ноября 2014
#define kImageOriginHight 300

- (void)scrollViewDidScroll:(UIScrollView *)scrollView1{
CGFloat yOffset  = scrollView1.contentOffset.y;

// NSLog(@" y offset := %f", yOffset);

//zoom images and hide upper view while scrooling to down position
if (yOffset < 0) {//-kImageOriginHight


    CGRect f = imgV.frame;
    f.origin.y = yOffset;
    f.size.height =  -yOffset + kImageOriginHight;
    imgV.frame = f;

    //viewTableUpperView.alpha = 1.5 - (yOffset/-kImageOriginHight);
    //viewTableUpperView.userInteractionEnabled = NO;

    if(yOffset+0.5 == -kImageOriginHight){
        [UIView animateWithDuration:0.1 animations:^{
            //viewTableUpperView.alpha = 1.0;
        }];
        //viewTableUpperView.userInteractionEnabled = YES;
    }
}

}

0 голосов
/ 21 февраля 2012

Вы можете попробовать использовать метод viewForHeaderInSection tableView для затененного представления (а также heightForHeaderInSection) ... Сделать затененную часть заголовком. Таким образом, поверх прокручиваемого содержимого есть фиксированный контент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...