Я хочу изменить высоту своего tableview от другого viewcontroller на основе суммы высот его ячеек, поскольку они являются динамичными. Это вообще возможно?Спасибо
Дополнение:
То, что я в основном имею, является UserProfileViewController, который имеет containerview на половине экрана. Там я добавляю другой другой viewcontrollers:
В случае стенной кнопки это - то, как я добавляю 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.Спасибо
Нет характеристики системы для изменения высоты таблицы, основанной на содержании 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 , или нажмите на ту первую вкладку на панели справа):
Позволяют нам предположить в течение секунды, что авторасположение было выключено. В этом случае это довольно просто, и 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];
}];
}
Для этого последнего решения на основе ограничений работать с авторасположением, мы должны заботиться о нескольких вещах сначала:
Удостоверяются, что Ваш tableview имеет ограничение высоты путем нажатия на центральную кнопку в группе кнопок здесь, и затем примите решение добавить ограничение высоты:
Затем добавляют IBOutlet
для того ограничения:
Удостоверяются, что Вы корректируете другие ограничения, таким образом, они не конфликтуют, если Вы корректируете размер tableview программно. В моем примере tableview имел ограничение конечного пробела, которое заблокировало его в нижнюю часть экрана, таким образом, я должен был скорректировать то ограничение так, чтобы вместо того, чтобы быть заблокированным в конкретном размере, это могло быть больше или равняться значению, и с более низким приоритетом, так, чтобы высота и вершина tableview управляли днем:
то, Что Вы делаете здесь с другими ограничениями, будет зависеть полностью от того, что другие средства управления Вы имеете на своем экране ниже tableview. Как всегда, имея дело с ограничениями является немного неловким, но это определенно работает, хотя специфические особенности в Вашей ситуации зависят полностью от того, что еще Вы имеете на сцене. Но надо надеяться Вы получаете идею. Нижняя строка, с авторасположением, удостоверяется, что скорректировала Ваши другие ограничения (если таковые имеются), чтобы быть гибкой для составления изменения tableview высота.
, Как Вы видите, намного легче программно регулировать высоту tableview, если Вы не используете авторасположение, но в случае, если Вы, я представляю обе альтернативы.
создайте свою ячейку xib или раскадровкой. дайте это - контент выхода. теперь назовите его в CellForRowAtIndexPath., например, если Вы хотите установить ширину ячеек согласно тексту метки Комментария.
таким образом устанавливает Вас commentsLbl.numberOfLine=0;
таким образом устанавливает Вас commentsLbl.numberOfLine=0;
затем в ViewDidLoad
self.table.estimatedRowHeight = 44.0 ;
self.table.rowHeight = UITableViewAutomaticDimension;
и теперь
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;}
Много ответов здесь не соблюдает изменения таблицы или является слишком сложным. Используя подкласс 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()
.
Это может быть в широком масштабе упрощено со всего 1 строкой кода в viewDidAppear:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
tableViewHeightConstraint.constant = tableView.contentSize.height
}
Решение Rob очень хорошо, только вещь, что в его -(void)adjustHeightOfTableview
метод вызов
[self.view needsUpdateConstraints]
ничего не делает, это просто возвращает флаг, вместо этого называние
[self.view setNeedsUpdateConstraints]
сделает желаемый эффект.
Используйте простой и легкий код
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
let myCell = tableView.dequeueReusableCellWithIdentifier("mannaCustumCell") as! CustomCell
let heightForCell = myCell.bounds.size.height;
return heightForCell;
}
для изменения размеров моей таблицы я пошел с этим решением в моей 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: но это - действительно не хороший способ сделать это. Какие-либо идеи?
Я нашел добавляющее ограничение программно намного легче, чем в раскадровке.
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)