Я искал эту проблему, но не смог найти рабочего ответа. Мне нужно показать прокрутку страницы, которая показывает некоторые представления, загруженные из файлов .xib, вот мой код:
Это код инициализации для TutorialPage.m, подкласса UIView:
- (id)initWithFrame:(CGRect)frame andPage:(int) page
{
self = [super initWithFrame:frame];
if (self) {
NSLog(@"tutorial page %d initialized", page);
switch (page) {
case 0:
self.view = [[[NSBundle mainBundle] loadNibNamed:@"TutorialPage01View" owner:self options:nil] objectAtIndex:0];
break;
case 1:
self.view = [[[NSBundle mainBundle] loadNibNamed:@"TutorialPage02View" owner:self options:nil] objectAtIndex:0];
break;
default:
break;
}
NSLog(@"frame %g %g, %g %g", frame.origin.x, frame.origin.y, frame.size.width, frame.size.height);
[self addSubview:self.view];
}
return self;
}
Страницы добавляются в scrollview следующим образом: приведенный ниже код является частью TutorialViewController.m, у которого есть допустимый выход scrollview:
- (void)viewDidLayoutSubviews
{
NSLog(@"tutorial view loaded");
self.scrollView.scrollEnabled = YES;
self.scrollView.pagingEnabled = YES;
self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * 2, self.scrollView.frame.size.height);
for (int i = 0 ; i < 2 ; i++) {
CGRect frame;
frame.origin.x = self.scrollView.frame.size.width * i;
frame.origin.y = 0;
frame.size = self.scrollView.frame.size;
UIView *subview = [[TutorialPage01 alloc] initWithFrame:frame andPage:i];
[self.scrollView addSubview:subview];
}
}
Макеты разделены на две половины по вертикали. И каждая половина имеет ограничения, чтобы она соответствовала виду контейнера и имела одинаковую высоту.
ПРОБЛЕМА
Когда представления добавляются к просмотру прокрутки, они как бы игнорируют автоматическое размещение, а вложенное представление, которое должно иметь размер (290, 538), представляется как (320,568), поэтому оно вторгается на другие страницы.
Можно ли добавить ограничения в файл .xib, а затем применить их к добавляемому супервизору в коде?
Заранее спасибо!
1 ответ
Это быстрый и грязный способ сделать это. Поскольку вы добавляете новый фрейм программно, вы также должны убедиться, что заменяемое представление соответствует фрейму, который вы инициируете.
- (id)initWithFrame:(CGRect)frame andPage:(int) page
{
self = [super initWithFrame:frame];
if (self) {
UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"TutorialView" owner:self options:nil] objectAtIndex:0];
view.frame = self.frame;
[self addSubview:view];
}
return self;
}
Мне показалось, что это сработало в гораздо более простом приложении, которое я построил на основе вашего кода.
Похожие вопросы
Новые вопросы
objective-c
Этот тег следует использовать только для вопросов, касающихся функций Objective-C или зависящих от кода на языке. Теги [cocoa] и [cocoa-touch] следует использовать, чтобы узнать о фреймворках или классах Apple. Используйте связанные теги [ios], [macos], [apple-watch] и [tvos] для проблем, характерных для этих платформ.