UITableViewCell当识别水龙头时,我的动画会高度显示它的高度.在iOS 9及更低版本中,这个动画很流畅,没有任何问题.在iOS 10测试版中,动画期间出现了一些不和谐的跳跃.有没有办法来解决这个问题?
这是代码的基本示例.
- (void)cellTapped {
[self.tableView beginUpdates];
[self.tableView endUpdates];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return self.shouldExpandCell ? 200.0f : 100.0f;
}
Run Code Online (Sandbox Code Playgroud)
编辑:9/8/16
这个问题在全球机制中仍然存在.经过更多调试后,我发现问题与单元格立即跳到新高度有关,然后将相关单元格偏移动画.这意味着任何CGRect依赖于单元格底部的基础动画都不起作用.
例如,如果我有一个约束到单元格底部的视图,它将跳转.解决方案将涉及使用动态常量对顶部的约束.或者想一下另一种方法来定位你的观点,然后再与底层相关.
我有一个表格视图,您可以在其中单击swich进入单元格,表格视图的许多单元格可能会更改其高度.计算哪些单元格会改变它们的大小有点复杂,所以我不想调用两次相同的代码.
我有一个heightForRowAtIndexPath方法(这是一个复杂的方法).
有没有办法让细胞生长或减少特征的动画而不会影响不改变的特征?
我已经尝试过UIViewAnimations,reloadData用于带动画的部分,但是我没有找到任何平滑的东西.我试图抓住每个必须更改的单元格,并在每个单元格上调用带动画的reloadData.它接近工作,但细胞一个接一个地更新.正如我之前所说,我不想这样做,因为我必须调用两次heightForRowAtIndexPath方法.
我想要的是能够使每个细胞变得生动的东西,这些细胞具有变化的高度,像生长或减少运动,而不是褪色.
你知道这样做的方法吗?还有一件事,当尺寸变化时(一些文字添加,背面颜色变化,以及类似的东西),单元格的内容会发生一些变化
关于UITableViewCell高度动画的Stack Overflow上有很多类似的问题,但是对于新的iOS8自动布局驱动的表视图没有任何效果.我的问题:
定制单元格:
@property (weak, nonatomic) IBOutlet iCarousel *carouselView;
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
@property (weak, nonatomic) IBOutlet UIButton *seeAllButton;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *carouselHeightConstraint;
Run Code Online (Sandbox Code Playgroud)
注意carouselHeightConstraint.这是内容视图的子视图(唯一的子视图)的高度约束.
高度设置230.0f为例如.首次加载时,它看起来像:

然后,在查看所有操作我要扩展单元格,我的代码:
- (IBAction)seeAllButtonAction:(id)sender {
BOOL vertical = !self.carouselCell.carouselView.vertical;
self.carouselCell.carouselView.type = vertical ? iCarouselTypeCylinder : iCarouselTypeLinear;
self.carouselCell.carouselView.vertical = vertical;
[UIView transitionWithView:self.carouselCell.carouselView
duration:0.2
options:0
animations:^{
self.carouselCell.carouselHeightConstraint.constant = vertical ? CGRectGetHeight(self.tableView.frame) : 230;
[self.carouselCell setNeedsUpdateConstraints];
[self.carouselCell updateConstraintsIfNeeded];
[self.tableView beginUpdates];
[self.tableView endUpdates];
completion:^(BOOL finished) { …Run Code Online (Sandbox Code Playgroud) 我这里有一个简单的示例项目:
http://dl.dropbox.com/u/7834263/ExpandingCells.zip
在这个项目中,UITableView有一个自定义的UITableViewCell.在每个单元格中有3个包含标签的UIViews.
目标是在敲击时扩展单元格,然后在再次敲击时将其折叠.单元格本身必须更改其高度以显示子视图.插入或删除行是不可接受的.
演示项目几乎按预期工作.事实上,在iOS 4.3中,它的工作非常完美.然而,在iOS 5下,当行崩溃时,先前的单元格神奇地消失.
要重新创建问题,请在iOS 5的模拟器或设备中运行项目,然后点击第一个单元格以展开它.然后再次点击该单元格以折叠它.最后,直接点击它下面的单元格.前一个消失了.
继续点击该部分中的每个单元格将导致所有单元格消失,直到整个部分缺失的位置.
我也尝试使用reloadData而不是当前的设置,但这会破坏动画并且感觉有点像黑客.reloadRowsAtIndexPaths应该可以工作,但问题是为什么不呢?
查看下面发生的事情的图像:
表格出现:

细胞扩展:

细胞塌陷:

细胞消失(当敲击下面的细胞时):

不断重复,直到整个部分消失:

编辑: 覆盖alpha是一个黑客,但有效.这是另一个"黑客"修复它,但为什么它修复它?
JVViewController.m第125行:
if( previousIndexPath_ != nil )
{
if( [previousIndexPath_ compare:indexPath] == NSOrderedSame ) currentCellSameAsPreviousCell = YES;
JVCell *previousCell = (JVCell*)[self cellForIndexPath:previousIndexPath_];
BOOL expanded = [previousCell expanded];
if( expanded )
{
[previousCell setExpanded:NO];
[indicesToReload addObject:[previousIndexPath_ copy]];
}
else if( currentCellSameAsPreviousCell )
{
[previousCell setExpanded:YES];
[indicesToReload addObject:[previousIndexPath_ copy]];
}
//[indicesToReload addObject:[previousIndexPath_ copy]];
}
Run Code Online (Sandbox Code Playgroud)
编辑2:
对演示项目做了一些小改动,值得检查并查看JVViewController didSelectRowAtIndexPath方法.
我有一个包含自定义单元格的UITableViewController.每个单元格都是使用nib创建的,并包含一个不可滚动的UITextView.我在每个单元格中添加了约束,以便单元格将其高度调整为UITextView的内容.所以最初我的控制器看起来像这样:
现在我希望当用户在单元格中键入内容时,其内容会自动适应.这个问题已被多次询问,特别是这里或第二个答案.因此,我在代码中编写了以下代理:
- (BOOL) textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text {
[self.tableView beginUpdates];
[self.tableView endUpdates];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
然而,它会导致以下奇怪的行为:忽略所有约束,并且所有单元格高度都会崩溃到最小值.见下图:
如果我向下滚动tableView以强制进行新的cellForRowAtIndexPath调用,我将恢复单元格的正确高度:
请注意,我并没有如我所料的autoLayout来照顾这实现heightForRowAtIndexPath.
有人能告诉我我做错了什么或帮助我吗?非常感谢你 !
我通过setExpanded:方法调用改变高度来扩展单元格.
然后我调用reloadRowsAtIndexPaths:刷新单元格.
问题是细胞消失并随机重新出现.我怀疑这与索引工作方式有关.
如果我调用reloadData或beginUpdates/endUpdates,单元格按预期工作,但我丢失了动画.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
JVCell *cell = (JVCell*)[tableView cellForRowAtIndexPath:indexPath];
JVCell *previousCell = nil;
if( previousIndexPath_ != nil ) // set to nil in viewDidLoad
{
previousCell = (JVCell*)[tableView cellForRowAtIndexPath:previousIndexPath_];
}
// expand or collapse cell if it's the same one as last time
if( previousCell != nil && [previousIndexPath_ compare:indexPath] == NSOrderedSame && [previousCell expandable] )
{
[previousCell setExpanded:![cell expanded]];
NSArray *indexPathArray = [NSArray arrayWithObject:previousIndexPath_];
[tableView reloadRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationAutomatic];
}
else
{
// collapse previous …Run Code Online (Sandbox Code Playgroud) 我想在选择UITableViewCell时改变它的高度.我可以通过定义来做到这一点
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
Run Code Online (Sandbox Code Playgroud)
并在选择单元格时调用tableview的reloadData,但我希望将更改设置为动画.关于如何解决这个问题的任何建议?
我有一个UITableView,单元格包含可变高度的UILabels.我能够计算标签需要使用的最小高度sizeWithFont:constrainedToSize:lineBreakMode:,这在首次加载表视图时工作正常.当我旋转表格视图时,单元格变宽(意味着显示内容所需的行数更少).在方向更改动画期间或之前或之后,有什么方法可以让UITableView重新确定单元格的高度?谢谢.
首先,请原谅我,如果答案已经存在(我老实说,我已经工作并且搜索了大约两周).
现在,情况如下:
我有UITextView作为的一个子视图UITableViewCell中UITableView.这UITextView是第一个响应者(当用户键入时).
我已经设置了(通过委托协议方法),以便在每个键入的字符之后,rowHeight重新计算单元格(正确地并在tableViews委托协议中为rowHeight).到目前为止一切都很好.
然后,我希望重新加载(或刷新,无论术语是什么)该单元格而不将其子视图UITextView作为第一响应者重新签名.
解决问题的一个不令人满意的解决方案:
我可以使用[tableView reloadData],然后[textView becomeFirstResponder]来模拟这种(让用户甚至不会注意到的TextView被重新加载)和rowHeight的是完美的,但是这已经引起了我很多的问题(特别是确保光标不每次用户键入一个字符时都不会跳到最后,并且由于textView重新签名而自动更正强制执行其建议.
有没有办法重绘或调整大小UITableViewCell(以动态更改它rowHeight)而不会导致其任何子视图作为第一响应者辞职?
下午好。
我已经在我的 iOS 应用程序的这个“功能”上苦苦挣扎了几个小时,我需要一些帮助。
问题:我应该如何实现,以便当用户输入UITextView尺寸的增加(仅底部边距)并且单元格增加其高度以UITextView同时动态适应?我不知道如何解决它。
研究: 经过一番搜索后,我发现在键入文本时动态更改单元格的高度,并重新加载包含的表格视图以调整大小以及 您可以在选择时对 UITableViewCell 上的高度变化进行动画处理吗? 我还阅读了https://developer.apple.com/documentation/uikit/uicollectionview但我觉得到目前为止我的快速知识不如这些帖子中的预期。
换句话说,我不知道如何为我的 UICollectionView 实现它。
UITextView我的代码现在看起来像这样(我在 EventsCell 中有更多 UI 元素,但将它们剪掉以节省空间,因此它只是我想要更改的底部边距)。我已经将 RootCell 设置delegate为我的UITextView,然后我打算在编辑时获取 textView 高度,以获得我想要的高度,但它不起作用。
细胞类别:
class EventsCell: UICollectionViewCell {
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor.white
setupViews()
}
let textView: GrowingTextView = { // GrowingTextView is a cocoapod extending UITextView
let rootCellDelegate = RootCell()
let tv = GrowingTextView()
tv.backgroundColor = .clear
tv.allowsEditingTextAttributes = true
tv.isScrollEnabled …Run Code Online (Sandbox Code Playgroud) uitableview ×8
ios ×5
iphone ×5
objective-c ×3
uitextview ×3
animation ×2
autolayout ×2
resize ×2
cocoa-touch ×1
height ×1
ios10 ×1
ios8 ×1
orientation ×1
swift ×1