2013-04-03 4 views
4

У меня есть UIScrollView, который содержит UIView и UITableView. Моя цель - настроить высоту UIScrollView, чтобы позволить мне прокручивать содержимое UIScrollView до определенной точки.Настройка высоты UIScrollView на основе UITableView

вот мой взгляд: он имеет верхнюю часть UIView и UITableView внизу.

enter image description here

Когда я перечисляю, я хочу, чтобы UIView остановиться в определенной точке, как так: enter image description here

Tableview сможет продолжить прокрутку, но UIView не будет зафиксирована на месте до тех пор, пользователь прокрутил страницу и вернул UIView в исходное состояние.

Ярким примером того, что я пытаюсь сделать, является AppStore.app на iOS 6. Когда вы просматриваете детали приложения, панель фильтров для деталей, обзоров и связанных с ними движется в верхней части экрана и останавливается , Надеюсь, все это имело смысл.

Благодаря

ответ

2

Я закончил тем, что шел с более простым подходом. не могу поверить, что я этого раньше не видел. Я создал два представления, один для таблицы tableHeaderView UITableView и один для viewForHeaderInSection. Представление, которое я хотел оставаться видимым во все времена, помещается в метод viewForHeaderInSection, а другое представление помещается в свойство tableHeaderView. Я думаю, что это гораздо более простой подход, чем использование scrollview.Единственная проблема, с которой я столкнулся с этим подходом, - это то, что все мои анимации UIView в этих двух представлениях больше не оживляют. Вот мой код.

[self.tableView setTableHeaderView:self.headerView]; 

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    return self.tableViewHeader; 
} 
+0

Я считаю, что это работает только для UITableView только с одним разделом. – SAHM

0

Вы можете легко достигнуть этого, устанавливая размер содержимого Scrollview правильно и держать высоту UITableView меньше высоты вашего ViewController, так что он подходит нижнюю часть верхней UIView и UITableView ...

Другой вариант - разделить верхний вид на 2 части. Часть, которая будет прокручиваться и часть, которая будет видна.

Затем установите часть, которая будет прокручиваться как весь заголовок UITableView и часть, которая останется видимой в виде заголовка для первой секции таблицы. Итак вы можете добиться этого с одной UITableView, без необходимости использовать UIScrollView

1

добавить себя в качестве UIScrollViewDelegate в UITableView и осуществлять - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView, так что если ваши взгляды на своих позициях стартерных они делают это:

- ваш UITableView одушевляет его размер во втором состоянии:

[UIView animateWithDuration:.1f animations:^{ 
     CGRect theFrame = myView.frame; 
     theFrame.size.height += floatOfIncreasedHeight; 
     myView.frame = theFrame; 
    }]; 

- ваш UIView одушевляет его вертикальное перемещение

[UIView animateWithDuration:3 delay:0 options:UIViewAnimationOptionCurveLinear animations:^(void){ 
     view.center = CGPointMake(view.center.x , view.center.y + floatOfVerticalMovement); 
     }completion:^(BOOL Finished){ 
     view.center = CGPointMake(view.center.x , view.center.y - floatOfVerticalMovement);] 

Наконец всегда в делегатом реализации – scrollViewDidScrollToTop: так, что вы знаете, может оживить обратно в исходное состояние (с использованием тех же методов, реверсивные).

UPDATE:

, поскольку ваши взгляды находятся внутри зрения прокрутки, есть более простой способ, если вы нормально с табличное быть отчасти из-за границы в вашем положении стартера (т.е.вместо изменения размера он просто прокручивается):

сделайте размер прокрутки размером до вашего окончательного tableview + ваш начальный (полный) вид и поместите его на 0,0 (так что его заключительная часть будет скрыта снаружи экрана)

scrollview.frame = CGRectMake(0,0,tableview.frame.size.width,tableview.frame.size.height + view.frame.size.height); 

вы делаете контейнер scrollview содержания таким большим, как весь табличном + все зрение + сумма зрения, что вы хотите из пути при прокрутке вида таблицы.

scrollview.contentSize = CGSizeMake(scrollview.frame.size.width, tableview.frame.size.height + view.frame.size.height + floatOfViewHeightIWantOutOfTheWay); 

вы размещаете вид один за другим в Scrollview оставляя все дополнительные пустое пространство после табличном

view.frame = CGRectMake(0,0,view.frame.size.width, view.frame.size.height); 

tableview.frame = CGRectMake(0,view.frame.size.height, tableview.frame.size.width, tableview.frame.size.height); 

теперь нужно просто работать, потому что, так как iOS 3 вложенная scrolling поддерживается

+0

Я понимаю, как все это работает, но я немного смущен. Мой UItableView загружает контент из API, а ячейки меняют размер соответственно, как я могу рассчитать высоту scrollview и tableView? –

+0

вам не нужен размер контента uitableview, только его кадр (тот, который мы видим во втором макете). Вы можете иметь столько строк, сколько хотите внутри uitableview, потому что это само по себе scrollview. – HermioneGreen

+0

также я не получил, если вы хотите, чтобы ваш верхний вид убирался с пути, когда пользователь прокручивает вверх или вниз по Uitableview. Если в моем ответе работает второй метод, он работает так, как если бы он был вниз, тогда вам все равно должен быть делегат tableview и scrollViewWillBeginDragging, где вы перенастраиваете внешний scrollview вручную, вызывая - scrollRectToVisible: анимированный: – HermioneGreen

0

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

Во-первых, легкая часть: притворная липкая точка зрения. Это «представление, которое всегда присутствует при прокрутке таблицы», реализованное как заголовок раздела. Делая количество секций в таблице 1, и реализации -headerViewForSection:, это можно легко сделать вид свиток с Tableview все бесплатно (API-накрест, что есть):

- (UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section { 
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,320,50)]; 
    label.text = @"Info that was always present when scrolling the UITableView"; 
    label.textAlignment = UITextAlignmentCenter; 
    label.backgroundColor = [UIColor colorWithRed:0.243 green:0.250 blue:0.253 alpha:1.000]; 
    label.textColor = UIColor.whiteColor; 
    return label; 
} 

Наконец, твердая часть: КВО. Когда таблица прокручивается, мы должны держать заголовок там липким относительно верхней части рамки представления, а это значит, что вы можете использовать KVO contentOffset и использовать результирующее изменение значения, чтобы приблизиться к кадру, к которому должен быть привязан вид немного MIN() магия. Если предположить, что заголовок составляет 44 пикселей в высоте, ниже код вычисляет соответствующее значение кадра:

CGPoint offset = [contentOffsetChange CGPointValue]; 
[self.tableView layoutSubviews]; 
self.tableView.tableHeaderView.frame = CGRectMake(0,MIN(0,offset.y),CGRectGetWidth(self.scrollView.frame),44); 

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

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

0

Что делать, если вы нарушите UIView в верхней и нижней частях. Днем будет информация.
Набор UITableView.tableHeaderView = topView в viewDidLoad
и возвращение bottomView в заголовок раздела в методе делегата, чтобы сделать его плавать:

(UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section 
{ 
    return bottomView; 
} 
0

Простое использование UITableView может решить вашу проблему. нет необходимости использовать другой вид прокрутки.

  1. настроить представление в виде заголовка UITableView. Затем добавьте текущий вид в представление заголовка.
  2. полный - (void)scrollViewDidScroll:(UIScrollView *)scrollView;. Tn - функция проверки содержимого на экране прокрутки и установка рамки текущего представления.
Смежные вопросы