Как заставить UIScrollView уважать расположение содержащего UIView? - PullRequest
1 голос
/ 23 ноября 2010

Я использую UIView для управления макетом моего представления (вместе с контроллером представления). Я хочу, чтобы UIScrollView использовал только половину вертикального экрана. Это прекрасно работает, если я использую верхнюю половину экрана, но не нижнюю.

Вот соответствующий код из UIViewController:

 - (void)loadView {
CGRect fullFrame = [[UIScreen mainScreen] applicationFrame]; 
//trying to put the scroll view on the bottom half of the screen, but does not work.
CGRect halfFrame = CGRectMake(0, fullFrame.size.height / 2 ,
    fullFrame.size.width, fullFrame.size.height / 2);
//use this instead for the scroll view to go to the top half of the screen (and work properly)
//CGRect halfFrame = CGRectMake(0, 0 , fullFrame.size.width, fullFrame.size.height / 2);

 UIScrollView* sv = [[UIScrollView alloc] initWithFrame:halfFrame]; 
[sv setContentSize:CGSizeMake(3 * halfFrame.size.width, halfFrame.size.height)];

CGRect stencilFrame = halfFrame;
UIView *leftView = [[UIView alloc] initWithFrame:stencilFrame];

stencilFrame.origin.x += stencilFrame.size.width;
UIView *centerView = [[UIView alloc] initWithFrame:stencilFrame];

stencilFrame.origin.x += stencilFrame.size.width;
UIView *rightView = [[UIView alloc] initWithFrame:stencilFrame];

//mix up the colors
[leftView setBackgroundColor:[UIColor redColor]];
[centerView setBackgroundColor:[UIColor greenColor]];
[rightView setBackgroundColor:[UIColor blueColor]];

//add them to the scroll view
[sv addSubview:leftView];
[sv addSubview:centerView];
[sv addSubview:rightView];

//turn on paging
[sv setPagingEnabled:YES];

UIView *containerView = [[UIView alloc]initWithFrame:fullFrame];
[containerView addSubview:sv];
[self setView:containerView];    
 }

Заранее благодарю за любой совет или помощь.

Ответы [ 3 ]

1 голос
/ 24 ноября 2010

Я понял это.Суть проблемы заключается в том, что представления в представлении с прокруткой инициализируются с тем же кадром, что и само представление с прокруткой.Когда scrollView инициализируется с halfFrame, источником является (0, половина размера полного экрана), что нормально, поскольку это относительно самого окна приложения.Тем не менее, представления, которые помещаются в scrollView (например, leftView), инициализируются в halfFrame, но в этом случае начало координат относительно scrollView, эффективно размещая их за пределами экрана.Установка источника в (0,0) исправляет это:

CGRect stencilFrame = CGRectMake (0, 0, fullFrame.size.width, fullFrame.size.height / 2);

0 голосов
/ 23 ноября 2010

У вас нет «полного кадра», если у вас есть панель навигации или панель вкладок. В общем, код, который использует [UIScreen mainScreen] для информации о макете, вероятно, неверен.

Кроме того, строка состояния может изменить размер, если (например) выполняется вызов или включен модем.

Вместо этого используйте любое нормальное значение для полного кадра и включите автоматическое изменение размера:

CGRect fullFrame = {{0,0}, {320,480}};

...

sv.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin;

РЕДАКТИРОВАТЬ: Вероятно, вам также необходимо создать подкласс UIScrollView и реализовать -setFrame:, чтобы он также устанавливал размер содержимого и -layoutSubviews для правильной компоновки.

0 голосов
/ 23 ноября 2010

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

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