Измените высоту UITableView динамично

Я хочу изменить высоту своего tableview от другого viewcontroller на основе суммы высот его ячеек, поскольку они являются динамичными. Это вообще возможно?Спасибо

Дополнение:

То, что я в основном имею, является UserProfileViewController, который имеет containerview на половине экрана. Там я добавляю другой другой viewcontrollers:

enter image description here

enter image description here

В случае стенной кнопки это - то, как я добавляю viewcontroller, и это - последующий tableview:

- (IBAction)wallButtonPressed:(id)sender
{
    //Check if there is an instance of the viewcontroller we want to display. If not make one and set it's tableview frame to the container's view bounds
    if(!_userWallViewController) {
        self.userWallViewController = [[WallViewController alloc] init];
//        self.userWallViewController.activityFeedTableView.frame = self.containerView.bounds;

    }

    [self.userWallViewController.containerView addSubview:self.userWallViewController.activityFeedTableView];
    //If the currentviewcontroller adn it's view are already added to the hierarchy remove them
    [self.currentViewController.view removeFromSuperview];
    [self.currentViewController removeFromParentViewController];

    //Add the desired viewcontroller to the currentviewcontroller
    self.currentViewController = self.userWallViewController;

    //Pass the data needed for the desired viewcontroller to it's instances
    self.userWallViewController.searchURLString = [NSString stringWithFormat:@"event/user/%@/", self.userID];
    self.userWallViewController.sendCommentURLString = [NSString stringWithFormat:@"event/message/%@", self.userID];

    [self.userWallViewController.activityFeedTableView reloadData];

    self.userWallViewController.totalCellHeight = ^(float totalCellHeight){

        self.scrollView.contentSize = CGSizeMake(320.0, totalCellHeight);
        CGRect newFrame = self.userWallViewController.containerView.frame;
        newFrame.size.height = totalCellHeight + 33.0;
        self.userWallViewController.containerView.frame = newFrame;

        self.userWallViewController.activityFeedTableView.frame = self.containerView.bounds;
    };

    //Add this containerview to the desired viewcontroller's containerView
    self.userWallViewController.containerView = self.containerView;


    //Add the needed viewcontroller and view to the parent viewcontroller and the containerview
    [self addChildViewController:self.userWallViewController];
    [self.containerView addSubview:self.userWallViewController.view];

    //CLEAN UP THE CONTAINER VIEW BY REMOVING THE PREVIOUS ADDED TABLE VIEWS
    [self.userFansViewController.userSimpleTableView removeFromSuperview];
    [self.fanOfViewController.userSimpleTableView removeFromSuperview];
    [self.userPublishedMovellaListViewController.gridView removeFromSuperview];

    [self.userPublishedMovellaListViewController removeFromParentViewController];

    self.userPublishedMovellaListViewController = nil;
}

и в этом viewcontroller это - то, где я инициализирую свой tableview:

-(UITableView *)activityFeedTableView
{
    if (!_activityFeedTableView) {
        _activityFeedTableView = [[UITableView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 850.0) style:UITableViewStylePlain];
    }
    return _activityFeedTableView;
}

Я вычисляю его общая сумма высоты ячейки, проблема состоит в том, что метод высоты ячейки называют путем после того, как метод считывания te tableview называют. Таким образом, мне был бы нужен своего рода способ знать, когда метод высоты ячеек сделан для всех ячеек, и затем я могу изменить размер своего tableview.Спасибо

62
задан 10 January 2013 в 01:34

8 ответов

Нет характеристики системы для изменения высоты таблицы, основанной на содержании tableview. Однако возможно программно изменить высоту tableview основанного на содержании, специфически основанном на contentSize из tableview (который легче, чем ручное вычисление высоты самостоятельно). Несколько подробных сведений варьируются в зависимости от того, используете ли Вы новое авторасположение, это - часть iOS 6, или нет.

, Но принятие Вы настраиваете базовую модель своего табличного представления в viewDidLoad, если Вы хотите затем регулировать высоту tableview, можно сделать это в viewDidAppear:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [self adjustHeightOfTableview];
}

Аналогично, если бы Вы когда-нибудь выполняете reloadData (или иначе добавляют или удаляют строки), для tableview, Вы хотели бы удостовериться, что Вы также вручную звоните adjustHeightOfTableView там также, например:

- (IBAction)onPressButton:(id)sender
{
    [self buildModel];
    [self.tableView reloadData];

    [self adjustHeightOfTableview];
}

, Таким образом, вопрос - то, что должно наш adjustHeightOfTableview делать. К сожалению, это - функция того, используете ли Вы авторасположение iOS 6 или нет. Можно определить, включили ли Вам авторасположение путем открытия раскадровки или NIB и переходите к "Инспектору Файла" (например, опция нажатия + команда + 1 , или нажмите на ту первую вкладку на панели справа):

enter image description here

Позволяют нам предположить в течение секунды, что авторасположение было выключено. В этом случае это довольно просто, и adjustHeightOfTableview просто корректировался бы frame из tableview:

- (void)adjustHeightOfTableview
{
    CGFloat height = self.tableView.contentSize.height;
    CGFloat maxHeight = self.tableView.superview.frame.size.height - self.tableView.frame.origin.y;

    // if the height of the content is greater than the maxHeight of
    // total space on the screen, limit the height to the size of the
    // superview.

    if (height > maxHeight)
        height = maxHeight;

    // now set the frame accordingly

    [UIView animateWithDuration:0.25 animations:^{
        CGRect frame = self.tableView.frame;
        frame.size.height = height;
        self.tableView.frame = frame;

        // if you have other controls that should be resized/moved to accommodate
        // the resized tableview, do that here, too
    }];
}

, Если бы Ваше авторасположение шло, тем не менее, adjustHeightOfTableview, скорректировал бы ограничение высоты для Вашего tableview:

- (void)adjustHeightOfTableview
{
    CGFloat height = self.tableView.contentSize.height;
    CGFloat maxHeight = self.tableView.superview.frame.size.height - self.tableView.frame.origin.y;

    // if the height of the content is greater than the maxHeight of
    // total space on the screen, limit the height to the size of the
    // superview.

    if (height > maxHeight)
        height = maxHeight;

    // now set the height constraint accordingly

    [UIView animateWithDuration:0.25 animations:^{
        self.tableViewHeightConstraint.constant = height;
        [self.view setNeedsUpdateConstraints];
    }];
}

Для этого последнего решения на основе ограничений работать с авторасположением, мы должны заботиться о нескольких вещах сначала:

  1. Удостоверяются, что Ваш tableview имеет ограничение высоты путем нажатия на центральную кнопку в группе кнопок здесь, и затем примите решение добавить ограничение высоты:

    add height constraint

  2. Затем добавляют IBOutlet для того ограничения:

    add IBOutlet

  3. Удостоверяются, что Вы корректируете другие ограничения, таким образом, они не конфликтуют, если Вы корректируете размер tableview программно. В моем примере tableview имел ограничение конечного пробела, которое заблокировало его в нижнюю часть экрана, таким образом, я должен был скорректировать то ограничение так, чтобы вместо того, чтобы быть заблокированным в конкретном размере, это могло быть больше или равняться значению, и с более низким приоритетом, так, чтобы высота и вершина tableview управляли днем:

    adjust other constraints

    то, Что Вы делаете здесь с другими ограничениями, будет зависеть полностью от того, что другие средства управления Вы имеете на своем экране ниже tableview. Как всегда, имея дело с ограничениями является немного неловким, но это определенно работает, хотя специфические особенности в Вашей ситуации зависят полностью от того, что еще Вы имеете на сцене. Но надо надеяться Вы получаете идею. Нижняя строка, с авторасположением, удостоверяется, что скорректировала Ваши другие ограничения (если таковые имеются), чтобы быть гибкой для составления изменения tableview высота.

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

174
ответ дан 31 October 2019 в 13:08

создайте свою ячейку xib или раскадровкой. дайте это - контент выхода. теперь назовите его в CellForRowAtIndexPath., например, если Вы хотите установить ширину ячеек согласно тексту метки Комментария. enter image description here

таким образом устанавливает Вас commentsLbl.numberOfLine=0; enter image description here

таким образом устанавливает Вас commentsLbl.numberOfLine=0;

затем в ViewDidLoad

 self.table.estimatedRowHeight = 44.0 ;
self.table.rowHeight = UITableViewAutomaticDimension;

и теперь

-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;}
20
ответ дан 31 October 2019 в 13:08

Много ответов здесь не соблюдает изменения таблицы или является слишком сложным. Используя подкласс UITableView, который правильно установит intrinsicContentSize, намного более легкое решение при использовании авторасположения. Никакие ограничения высоты и т.д. не необходимы.

class UIDynamicTableView: UITableView
{
    override var intrinsicContentSize: CGSize {
        self.layoutIfNeeded()
        return CGSize(width: UIViewNoIntrinsicMetric, height: self.contentSize.height)
    }

    override func reloadData() {
        super.reloadData()
        self.invalidateIntrinsicContentSize()
    }
} 

Набор класс Вашего TableView к UIDynamicTableView в интерфейсном разработчике и наблюдает волшебство, когда этот TableView изменится, это - размер после вызова к reloadData().

10
ответ дан 31 October 2019 в 13:08

Это может быть в широком масштабе упрощено со всего 1 строкой кода в viewDidAppear:

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        tableViewHeightConstraint.constant = tableView.contentSize.height
    }
7
ответ дан 31 October 2019 в 13:08

Решение Rob очень хорошо, только вещь, что в его -(void)adjustHeightOfTableview метод вызов

[self.view needsUpdateConstraints]

ничего не делает, это просто возвращает флаг, вместо этого называние

[self.view setNeedsUpdateConstraints]

сделает желаемый эффект.

5
ответ дан 31 October 2019 в 13:08

Используйте простой и легкий код

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        let myCell = tableView.dequeueReusableCellWithIdentifier("mannaCustumCell") as! CustomCell
        let heightForCell = myCell.bounds.size.height;

        return heightForCell;
    }
3
ответ дан 31 October 2019 в 13:08

для изменения размеров моей таблицы я пошел с этим решением в моей tableview ведьме контроллера, прекрасно подходит:

[objectManager getObjectsAtPath:self.searchURLString
                         parameters:nil
                            success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                                NSArray* results = [mappingResult array];
                                self.eventArray = results;
                                NSLog(@"Events number at first: %i", [self.eventArray count]);
                                CGRect newFrame = self.activityFeedTableView.frame;
                                newFrame.size.height = self.cellsHeight + 30.0;
                                self.activityFeedTableView.frame = newFrame;

                                self.cellsHeight = 0.0;

                            }
                            failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                                                message:[error localizedDescription]
                                                                               delegate:nil
                                                                      cancelButtonTitle:@"OK"
                                                                      otherButtonTitles:nil];
                                [alert show];
                                NSLog(@"Hit error: %@", error);
                            }];

часть изменения размеров находится в методе, но здесь именно так, Вы видите его. Теперь единственная проблема я haveis, который изменение размеров прокрутки просматривает в другом контроллере представления, поскольку я понятия не имею, когда tableview закончил изменять размер. В данный момент я делаю его с performSelector: afterDelay: но это - действительно не хороший способ сделать это. Какие-либо идеи?

2
ответ дан 31 October 2019 в 13:08

Я нашел добавляющее ограничение программно намного легче, чем в раскадровке.

    var leadingMargin = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.LeadingMargin, relatedBy: NSLayoutRelation.Equal, toItem: self.mView, attribute: NSLayoutAttribute.LeadingMargin, multiplier: 1, constant: 0.0)

    var trailingMargin = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.TrailingMargin, relatedBy: NSLayoutRelation.Equal, toItem: mView, attribute: NSLayoutAttribute.TrailingMargin, multiplier: 1, constant: 0.0)

    var height = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: screenSize.height - 55)

    var bottom = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.BottomMargin, relatedBy: NSLayoutRelation.Equal, toItem: self.mView, attribute: NSLayoutAttribute.BottomMargin, multiplier: 1, constant: screenSize.height - 200)

    var top = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.TopMargin, relatedBy: NSLayoutRelation.Equal, toItem: self.mView, attribute: NSLayoutAttribute.TopMargin, multiplier: 1, constant: 250)

    self.view.addConstraint(leadingMargin)
    self.view.addConstraint(trailingMargin)
    self.view.addConstraint(height)
    self.view.addConstraint(bottom)
    self.view.addConstraint(top)
0
ответ дан 31 October 2019 в 13:08

Другие вопросы по тегам:

Похожие вопросы: