2016-06-01 1 views
0

В настоящее время у меня есть UITableView с динамическим размером UITableViewCell объектов. Это основано на динамическом контенте для UITextView. Это работает как шарм, и я смог избавиться от моей неуклюжей и неточной ручной реализации heightForRowAtIndexPath.UITableViewCell - Как добавить ограничение в UITextView ДО heightForRowAtIndex вычисляется

Теперь я хотел бы дать пользователю возможность ограничить максимальную высоту ячейки - это то, что они могут включать и выключать. Если он выключен, я хочу, чтобы все работало точно так же, как сейчас: не нужно, чтобы я выяснял, как правильно переопределить heightForRowAtIndexPath, а ячейки растут до размера содержимого. Однако, если пользователь включил этот параметр, я хочу установить максимальную высоту для строки.

я могу ограничить высоту UITextView, добавив следующее ограничение:

[aCell addConstraint:[NSLayoutConstraint constraintWithItem:aCell.details 
                attribute:NSLayoutAttributeHeight 
                relatedBy:NSLayoutRelationLessThanOrEqual 
                toItem:nil 
                attribute:NSLayoutAttributeNotAnAttribute 
               multiplier:1.0 
                constant:[maxHeight floatValue]]]; 

К сожалению, это происходит в cellForRowAtIndexPath методе, который происходит после размер ячейки был определен, так что это кажется. Либо это, либо не рассматривает новое ограничение при определении размера ячейки.

Как я могу ограничить высоту ячейки без необходимости переопределять метод heightForRowAtIndexPath?

+0

Кто-то проголосовал за мой вопрос - как насчет того, чтобы вы разместили комментарий здесь о том, как его улучшить? – thephatp

ответ

1

Если вы используете autolayout чем нет необходимости реализовывать heightForRowAtIndexpath:

Просто добавьте это в viewDidLoad и установить все значения и ограничения в cellForRowAtIndexpath:

tblView.estimatedRowHeight = 44.0; 
tblView.rowHeight = UITableViewAutomaticDimension; 
+0

Забавно, я почти добавил строку, говорящую «для полноты ...», что я уже настраивал их, но это не так просто. Как я уже сказал, это динамически правильное определение размера без ограничения. Но когда я добавляю ограничение, это не соблюдение нового ограничения «меньше или равно». Должно быть? Возможно ли, что у меня есть другие ограничения, которые препятствуют этому? – thephatp

0

Нет необходимости добавлять ограничения и застрять в Это. Просто установите верхние, нижние, ведущие и конечные ограничения для текста View, кроме ограничения высоты. Добавьте функцию ниже в свой контроллер.

-(CGSize)getLabelSizeFortext:(NSString *)text forWidth:(float)width WithFont:(UIFont *)font 
{ 
    CGSize constraint = CGSizeMake(width, MAXFLOAT); 
    // Get the size of the text given the CGSize we just made as a constraint 

    CGRect titleRect = [text boundingRectWithSize:constraint options:(NSStringDrawingUsesLineFragmentOrigin| NSStringDrawingTruncatesLastVisibleLine) attributes:@{NSFontAttributeName:font} context:nil]; 
    return titleRect.size; 

} 

Тогда в Tableview: heightForRowAtIndexPath: вы можете сделать это, например, как показано ниже: -

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 
    UITextView *myTextView = (UITextView *)[cell viewWithTag:1111]; 
    CGFloat height = [self getLabelSizeFortext:description forWidth:myTextView.frame.size.width WithFont:kFontRobotoRegular(15)].height; 
    return height + 5.0; // 5.0 is the extra padding 
} 

Попробуйте. Это определенно сработает. Я использую его всегда для динамической высоты моей ячейки. Это очень легко. Если у вас есть еще несколько объектов, таких как ярлыки и т. Д. внутри вашей ячейки тогда, возвращаясь в heightForRowAtIndexPath:, добавьте их высоты вместе со своими константами верхнего и нижнего ограничений. Не используйте слишком много отступов, но можете использовать различные отдельные дополнения для устройств iPhone и iPad.

+1

Это очень ограниченное решение. Опять же, в моем первоначальном вопросе, я спрашиваю, как сделать это _without_ переопределения heightForRowAtIndexpath.Это также кажется весьма неэффективным с точки зрения производительности. Я закончил тем, что изменил его на UILabel и перешел (потому что вы можете ограничить максимальные строки с помощью UILabel). – thephatp

1

Вы можете попытаться ссылаться на ограничение по высоте от вашего IB к подклассу вашей ячейки, а затем изменить его атрибуты (на основе конфигурации, предоставленной вашим пользователем) внутри вашего подкласса ячейки. Это избавит вас от необходимости добавлять/удалять ограничения вручную в коде, просто редактируя ограничение, на которое ссылается. Вы также можете комбинировать концепцию установки ваших ограничений как активных или неактивных в настройке автоматической компоновки.

 Смежные вопросы

  • Нет связанных вопросов^_^