Что такое свойство UIScrollView contentInset?

Может кто-нибудь объяснить мне, для чего используется свойство contentInset в экземпляре UIScrollView? А может быть, пример?

Ответ 1

Он устанавливает расстояние вставки между представлением содержимого и представлением прокрутки. aScrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 7.0);

Вот хорошая статья о справочной библиотеке iOS по представлениям с прокруткой, на которой есть информативный снимок экрана (рис. 1-3). Я скопирую ее с помощью текста здесь:

  _|←_cW_→_|_↓_
   |       | 
---------------
   |content| ↑
 ↑ |content| contentInset.top
cH |content|
 ↓ |content| contentInset.bottom
   |content| ↓
---------------
  _|_______|___ 
             ↑


   (cH = contentSize.height; cW = contentSize.width)

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

Ответ 2

В то время как ответ jball - отличное описание вложений контента, он не отвечает на вопрос о том, когда его использовать. Я займусь его диаграммами:

  _|←_cW_→_|_↓_
   |       | 
---------------
   |content| ↑
 ↑ |content| contentInset.top
cH |content|
 ↓ |content| contentInset.bottom
   |content| ↓
---------------
   |content|    
-------------↑-

Это то, что вы получаете, когда делаете это, но полезность этого только показывает, когда вы прокручиваете:

  _|←_cW_→_|_↓_
   |content| ← content is still visible
---------------
   |content| ↑
 ↑ |content| contentInset.top
cH |content|
 ↓ |content| contentInset.bottom
   |content| ↓
---------------
  _|_______|___ 
             ↑

Эта верхняя строка содержимого будет по-прежнему видна, поскольку она все еще находится внутри кадра прокрутки. Один из способов подумать о верхнем смещении - "сколько сдвинуть контент вниз по списку прокрутки, когда мы прокручиваемся до самого верха"

Чтобы увидеть место, где это действительно используется, посмотрите на приложение встроенных фотографий на iphone. Панель навигации и строка состояния прозрачны, а содержимое прокрутки видимо снизу. Это потому, что рамка просмотра прокрутки простирается далеко. Но если бы это было не для вставки содержимого, вы никогда не смогли бы очистить верхнюю часть содержимого прозрачной навигационной панели, когда вы пройдете весь путь вверх.

Ответ 3

Вставки содержимого решают проблему наличия содержимого, которое находится под другими частями пользовательского интерфейса и все же остается доступным с помощью полос прокрутки. Другими словами, цель Content Inset заключается в том, чтобы сделать область взаимодействия меньшей, чем ее фактическая область.

Рассмотрим случай, когда у нас есть три логические области экрана:

TOP BUTTONS

TEXT

BOTTOM TAB BAR

и мы хотим, чтобы ТЕКСТ никогда не отображался прозрачно под верхними клавишами, но мы хотим, чтобы текст появлялся под BOTTOM TAB BAR и все же позволял прокручивать, чтобы мы могли обновить текст, сидящий прозрачно под BOTTOM TAB BAR.

Затем мы установили верхнее начало ниже TOP BUTTONS и высоту, чтобы включить нижнюю часть BOTTOM TAB BAR. Чтобы получить доступ к тексту, сидящему под содержимым BOTTOM TAB BAR, мы установили бы нижнюю вставку как высоту BOTTOM TAB BAR.

Без вставки скроллер не позволит вам прокручивать контент, достаточный для ввода в него. С вставкой, как если бы содержимое содержало дополнительный "BLANK CONTENT" размер вставки содержимого. Пустой текст был "вставлен" в реальный "контент" - как я помню концепцию.

Ответ 4

Используется для добавления отступов в UIScrollView

Без contentInset табличное представление выглядит так:

enter image description here

Затем установите contentInset:

tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

Эффект, как показано ниже:

enter image description here

Кажется, лучше, правда?

И я пишу блог для изучения contentInset, критика приветствуется.

Ответ 5

Отличный вопрос.

Рассмотрим следующий пример (scroller - это UIScrollView):

float offset = 1000;
[super viewDidLoad];
for (int i=0;i<500; i++) {
    UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(i * 100, 50, 95, 100)] autorelease];
    [label setText:[NSString stringWithFormat:@"label %d",i]];
    [self.scroller addSubview:label];
    [self.scroller setContentSize:CGSizeMake(self.view.frame.size.width * 2 + offset, 0)];
    [self.scroller setContentInset:UIEdgeInsetsMake(0, -offset, 0, 0)];
}

Вставки - это ТОЛЬКО способ заставить ваш скроллер иметь "окно" на том, где вы хотите. Я все еще возился с этим примером кода, но идея там: используйте вставки, чтобы получить "окно" на вашем UIScrollView.