Я собираюсь добавить UIScrollView
в свой проект iPhone, и перед тем, как реализовать эту функцию, я хотел проверить, является ли мой подход правильным или может ли я нарушать некоторые рекомендации, о которых я не знаю.
Уроки, которые я видел, обычно включают добавление UIScrollView
к существующему UIView
, и они работают оттуда. Однако мне было интересно, могу ли я вообще сэкономить UIView
и просто добавить UIScrollView
в качестве единственного объекта верхнего уровня в моем nib-файле.
В моем примере проекта используется приложение Xcode * View-based template:
Навигатор проекта http://img542.imageshack.us/img542/5364/projectnavigator.png
Я удалил объект верхнего уровня UIView
из исходного файла MySampleViewController.xib
и заменил его, добавив объект UIScrollView
:
Перья заполнителей http://img526.imageshack.us/img526/7709/placeholderobjects.png
Теперь мой nib-файл показывает только этот объект на холсте:
Холст http://img233.imageshack.us/img233/4063/scrollview.png
Затем я создал ссылку из UIViewController
s view
розетки на UIScrollView
.
Теперь, если я хочу программно манипулировать содержимым UIScrollView, я могу использовать этот код:
- (void)viewDidLoad {
[super viewDidLoad];
NSArray *colors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor blueColor], nil];
// Solution B: With the following line we avoid creating an extra outlet linking to the UIScrollView top-level object in the nib file
UIScrollView *scrollView = (UIScrollView *)self.view;
for (int i = 0; i < colors.count; i++) {
CGRect frame;
//frame.origin.x = self.scroller.frame.size.width * i; // Solution A: scroller is an IBOutlet UIScrollView *scroller;
frame.origin.x = scrollView.frame.size.width * i; // Solution B
frame.origin.y = 0;
//frame.size = self.scroller.frame.size; // Solution A
frame.size = scrollView.frame.size; // Solution B
UIView *subView = [[UIView alloc] initWithFrame:frame];
subView.backgroundColor = [colors objectAtIndex:i];
//[self.scroller addSubview:subView]; // Solution A
[self.view addSubview:subView]; // Solution B
[subView release];
}
//self.scroller.contentSize = CGSizeMake(self.scroller.frame.size.width * colors.count, self.scroller.frame.size.height); // Solution A
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * colors.count, scrollView.frame.size.height); // Solution B
}
Для реализации решения A выход скроллера должен быть также связан с UIScrollView пера, а инспектор подключений выглядит следующим образом:
Инспектор соединений http://img228.imageshack.us/img228/8397/connectionsj.png
Решение A требует розетки, и это означает, что имеется два подключения к UIScrollView
: собственная UIViewController
view
и MySampleViewController
scroller
. Законно и / или рекомендовано ли иметь два выхода, указывающих на один и тот же вид?
Решение B включает только выход UIViewController
view
, связанный с видом и использующий эту строку:
UIScrollView *scrollView = (UIScrollView *)self.view;
Мои вопросы:
- Влечет ли я какое-то нарушение правил разработки Apple при использовании одного из этих двух решений?
- Должен ли я придерживаться UIScrollView в решении UIView?
- Есть ли другой способ реализовать это?
Спасибо!
P.S. Извините за подсветку синтаксиса, SO не распознал использование тега 'target-c'