CustomView с динамическим ScrollView ContentSize Autolayout вызывается в addSubview - PullRequest
0 голосов
/ 10 октября 2018

У меня есть customView, созданный в xib с высотой = 800:

customView with 800 height

Я хочу вызвать его через addSubview в синий вид, как показано на рисункеUIViewController:

wantToShowHereView in UIViewController

проблема здесь в том, что я хочу, чтобы мой UIScrollView мог динамически устанавливать его contentSize, потому что здесь я определяю его высоту 800:

enter image description here

Я читал из другой статьи, что contentSize в AutoLayout будет определяться высотой его подпредставления, в данном случае contentView.но все же после того, как я установил высоту 800, свиток не достигает нижней части вида (розовый).как установить автопоставку тогда?

Broken ScrollView

вот мой код в customView:

- (id)initWithFrame:(CGRect)frame
{
NSLog(@"initWithFrame");
self = [super initWithFrame:frame];
if (self) {
    [self setup];
}
return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder {
NSLog(@"initWithCoder");
self = [super initWithCoder:aDecoder];
if(self) {
    [self setup];
}
return self;
}

- (void)setup {

[[NSBundle mainBundle] loadNibNamed:@"customView" owner:self options:nil];
[self addSubview:self.view];
NSLog(@"contentSize Height :%f", self.myscrollview.contentSize.height);
NSLog(@"contentView Height :%f", self.contentView.frame.size.height);
}

в моем ViewController.miназвал это так:

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

customView *customV = [[customView alloc] initWithFrame:self.wantToShowHereView.bounds];
[self.wantToShowHereView addSubview:customV];

}

Может кто-нибудь дать мне указание о том, как я хочу этого достичь?Вот мой пример проекта, чтобы прояснить для вас: Пример AutoLayoutScrollView

1 Ответ

0 голосов
/ 10 октября 2018

Пара вопросов.

Сначала вы устанавливаете фрейм customV на границы wantToShowHereView - но вы делаете это в viewDidLoad().Эти границы почти наверняка изменятся между viewDidLoad() и временем, когда вы на самом деле видите его на экране (размер устройства, ориентация и т. Д.).

Во-вторых, customV - это UIView, к которому вы добавляете«Корневое представление» XIB (которое содержит ваше представление прокрутки) как подпредставление для customV ... но вы не устанавливаете никаких ограничений (или других способов изменения размера) для , которые вид.

В-третьих, вы смешиваете относительные ограничения с абсолютными (ширина, высота, опережение, опережение и т. Д.), Что снова вызовет проблемы при изменении общего фрейма ... и вы явно устанавливаете фрейм customV вместо добавления ограничений во время выполнения.

Вы можете начать исправление вещей:

Шаг первый - удалить customV инстанцированиеот viewDidLoad().

Шаг второй - добавьте следующий метод viewDidAppear().

- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];

    customView *customV = [[customView alloc] initWithFrame:self.wantToShowHereView.bounds];
    customV.view.frame = customV.bounds;
    [self.wantToShowHereView addSubview:customV];

}

Сделав только то, что должно дать вам правильно прокручиваемый вид.

Что вы вероятно хотите сделать, хотя, это сохранить инициализацию в viewDidAppear(), но добавить туда ограничения, чтобы использовать автоматическое размещение.

Кроме того, я бы рекомендовал заново обработать ограничения на элементах в customView.xib, поэтому прокрутка (contentSize) определяется фактическим содержанием вашего представления прокрутки, а не жестким кодированием высоты вашего contentView.


Редактировать:

Вот как может выглядеть ваш viewDidLoadViewController.m):

- (void)viewDidLoad
{
    [super viewDidLoad];

    customView *customV = [[customView alloc] initWithFrame:self.wantToShowHereView.bounds];
    [self.wantToShowHereView addSubview:customV];

    customV.translatesAutoresizingMaskIntoConstraints = NO;

    [customV.topAnchor constraintEqualToAnchor:self.wantToShowHereView.topAnchor].active = YES;
    [customV.bottomAnchor constraintEqualToAnchor:self.wantToShowHereView.bottomAnchor].active = YES;
    [customV.leadingAnchor constraintEqualToAnchor:self.wantToShowHereView.leadingAnchor].active = YES;
    [customV.trailingAnchor constraintEqualToAnchor:self.wantToShowHereView.trailingAnchor].active = YES;

}

и setup в customView.m:

- (void)setup {

    [[NSBundle mainBundle] loadNibNamed:@"customView" owner:self options:nil];
    [self addSubview:self.view];

    self.view.translatesAutoresizingMaskIntoConstraints = NO;

    [self.view.topAnchor constraintEqualToAnchor:self.topAnchor].active = YES;
    [self.view.bottomAnchor constraintEqualToAnchor:self.bottomAnchor].active = YES;
    [self.view.leadingAnchor constraintEqualToAnchor:self.leadingAnchor].active = YES;
    [self.view.trailingAnchor constraintEqualToAnchor:self.trailingAnchor].active = YES;

    NSLog(@"contentSize Height :%f", self.myscrollview.contentSize.height);
    NSLog(@"contentView Height :%f", self.contentView.frame.size.height);

}
...