Центрировать UITableView внутри подпредставления

В конечном итоге я пытаюсь вертикально центрировать свои ячейки представления таблицы в UITableView, если общее количество ячеек * высота строки ‹высота tableView

Моя проблема в том, что всякий раз, когда я пытаюсь сослаться на высоту представления таблицы (размер которой должен быть изменен при добавлении в его супервизор. Он возвращает исходную высоту представления, как определено в Interface Builder).

Вот метод, который добавляет subView с tableView:

- (void)addMissonListView {
    missionView = [BSMissionListView loadMissionView:YES];
    BSList *list = (BSList *)self.dataModel;
    missionView.missionList = list.arrayMissions;
    missionView.delegate = self;
    missionView.heightofSuperView = [NSNumber numberWithFloat:viewBottomContainer.frame.size.height];
    [viewBottomContainer addSubview:missionView];


    [viewBottomContainer setTranslatesAutoresizingMaskIntoConstraints:NO];
    [BSUtility setConstraintsOnView:viewBottomContainer relativeTo:missionView withConstant:0];   
}

Это вызываемый метод setsConstraintsOnView:

+ (void)setConstraintsOnView:(UIView *)superView relativeTo:(UIView *)subView withConstant:(int)constant
{
    [subView setTranslatesAutoresizingMaskIntoConstraints:NO];

    [superView addConstraint:[NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeBottom multiplier:1 constant:constant]];

    [superView addConstraint:[NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeTop multiplier:1 constant:constant]];

    [superView addConstraint:[NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeRight multiplier:1 constant:constant]];

    [superView addConstraint:[NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeLeft multiplier:1 constant:constant]];
}
  • Подпредставление состоит из tableView внутри UIView. В Interface Builder размер UIView составляет 320 X 586, а размер tableView - 310 x 558.
  • Размер viewBottomContainer в IB - 320 x 408

Я пытаюсь получить информацию о высоте представления и tableView в методе configureGUI. И как только это сработает, я передам его другому методу для создания contentOffset в TableView. но NSLog продолжает возвращать исходные значения, а не значения с измененным размером.

Это методы из класса BSMissionListView:

- (void)awakeFromNib {
    [super awakeFromNib];

    [self configureGUI];
}

- (void)configureGUI {
    [super configureGUI];

    NSLog(@"Bounds height of the View is %f",self.bounds.size.height);
    NSLog(@"Bounds height of the tableView is %f",self.tableViewMissionList.bounds.size.height);
    [self setBackgroundColor:[UIColor clearColor]];
}

Я буду рад опубликовать больше кода, если это будет полезно. Спасибо!


person got2jam    schedule 09.02.2015    source источник
comment
у вас translatesAutoresizingMaskIntoConstraints установлен на NO на missionView?   -  person Alex Reynolds    schedule 10.02.2015
comment
Я не установил в BSMissionViewList.   -  person got2jam    schedule 10.02.2015
comment
если вы собираетесь применять к нему ограничения, вам нужно отключить переводы, иначе ограничения не будут применяться.   -  person Alex Reynolds    schedule 10.02.2015
comment
Чтобы прояснить subView и tableView, меняют размер и работают как задумано. Я просто не могу понять, почему я не могу получить доступ к свойствам CGRect после того, как их размер был изменен с помощью setConstraintsOnView   -  person got2jam    schedule 10.02.2015
comment
вы звоните [superview layoutIfNeeded], чтобы применить эти ограничения?   -  person Alex Reynolds    schedule 10.02.2015
comment
@Alex, Оказывается, нужно было изменить метод класса загрузки пользовательских перьев и установить таким образом переменную высоты. Спасибо за твою помощь   -  person got2jam    schedule 15.02.2015


Ответы (1)


Мне удалось решить проблему, передав высоту superView tableView с помощью метода, который загрузил перо tableView.

-Я добавил переменную CGFloat в метод, загружающий перо в класс BSMissionListView

-Я передал высоту viewBottomContainer, а затем использовал это, чтобы установить значение heightOfSuperView во вновь измененном методе.

Значение -heightOfSuperView используется для вычисления contentInset TableView, чтобы центрировать его внутри superView

Спасибо @Alex Renyolds за помощь.

- (void)addMissonListView {
[viewBottomContainer setNeedsLayout];
[viewBottomContainer layoutIfNeeded];
[viewBottomContainer setTranslatesAutoresizingMaskIntoConstraints:NO];
NSLog(@"Height of bottomViewContrainer: %f", viewBottomContainer.bounds.size.height);
BSList *list = (BSList *)self.dataModel;
missionView = [BSMissionListView loadMissionView:YES heightOfSuperView:viewBottomContainer.bounds.size.height listArray:list.arrayMissions];

missionView.delegate = self;
[viewBottomContainer addSubview:missionView];
[viewBottomContainer setTranslatesAutoresizingMaskIntoConstraints:NO];
[BSUtility setConstraintsOnView:viewBottomContainer relativeTo:missionView withConstant:0];

}

BSMissionList

+ (BSMissionListView *)loadMissionView:(BOOL)isEditable heightOfSuperView:(CGFloat)height listArray:(NSMutableArray *)list {
BSMissionListView *missionListView = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([BSMissionListView class]) owner:nil options:nil] lastObject];
missionListView.missionList = list;
missionListView.isEditable = isEditable;
missionListView.heightofSuperView = (height- 49);
[missionListView configureGUI];

return missionListView;

}

person got2jam    schedule 15.02.2015