对于iPad项目,我实现了类似NSBrowser的界面,它支持动态数量的列。每列都由UITableView表示。
添加或删除列时,我正在使用UIView的animateWithDuration:动画:更改UITableView的宽度。
我遇到的问题:
系统为每个表格视图单元格的imageView添加一个不需要的帧大小动画,该动画会从非常大的大小调整到它的初始大小。这看起来很尴尬,所以我正在寻找摆脱它的方法 - 同时保持封闭tableViews的动画帧大小更改。
任何想法我可能做错了什么?
我在这里发布了一个示例项目演示问题: https://github.com/iljaiwas/TableViewFrameTest
这是我设置单元格的地方: https://github.com/iljaiwas/TableViewFrameTest/blob/master/TableViewFrameTest/TestTableViewController.m#L61
这是我触发动画的地方: https://github.com/iljaiwas/TableViewFrameTest/blob/master/TableViewFrameTest/TestViewController.m#L46
答案 0 :(得分:2)
我遇到了同样的问题,发现这个链接(http://www.objc.io/issue-5/iOS7-hidden-gems-and-workarounds.html)有一个关于阻止动画的部分。
要使您的示例正常工作,请在import语句后面的TestTableViewController.m顶部添加以下内容:
@interface MyTableViewCell : UITableViewCell
@end
@implementation MyTableViewCell
- (void) layoutSubviews {
[UIView performWithoutAnimation:^{
[super layoutSubviews];
}];}
@end
然后在viewDidLoad中更改以下行以使用MyTableViewCell:
[self.tableView registerClass:[MyTableViewCell class] forCellReuseIdentifier:@"Cell"];
现在运行示例,您将不再拥有不需要的图像动画。
答案 1 :(得分:1)
这对我说: 设置UIImageView ** (在TableView单元格中) ** contentMode to aspect Fit。
不知道为什么,但对我有用。
答案 2 :(得分:0)
当编辑动画触发显示删除按钮时,我的(相当大)图像从原始大小缩小时出现了类似的问题。当它缩小时,图片将飞过我的屏幕。太疯狂了。无论如何,我在UIImage
上使用此类别修改了图片,以便在将图片放入UIImageView
之前调整图片大小:
- (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)scaledSize {
UIGraphicsBeginImageContext(scaledSize);
[image drawInRect:CGRectMake(0, 0, scaledSize.width, scaledSize.height)];
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return scaledImage;
}
编辑:这是另一个类别,可以更好地缩小图像,具体取决于您需要它的外观。我最初在另一个SO问题上发现了这些问题,但现在似乎无法找到链接,但我用它们作为起点,这个问题特别有帮助:
- (UIImage *)imageScaledToFitRect:(CGRect)rect {
// compute scale factor for imageView
CGFloat widthScaleFactor = CGRectGetWidth(rect) / self.size.width;
CGFloat heightScaleFactor = CGRectGetHeight(rect) / self.size.height;
NSLog(@"Rect width: %f, Image width: %f, WidthFactor: %f", rect.size.width, self.size.width, widthScaleFactor);
NSLog(@"Rect height: %f, Image height: %f, HeightFactor: %f", rect.size.height, self.size.height, heightScaleFactor);
CGFloat imageViewXOrigin = 0;
CGFloat imageViewYOrigin = 0;
CGFloat imageViewWidth = 0;
CGFloat imageViewHeight = 0;
// if image is narrow and tall, scale to width and align vertically to the top
if (widthScaleFactor > heightScaleFactor) {
imageViewWidth = self.size.width * widthScaleFactor;
imageViewHeight = self.size.height * widthScaleFactor;
}
// else if image is wide and short, scale to height and align horizontally centered
else {
imageViewWidth = self.size.width * heightScaleFactor;
imageViewHeight = self.size.height * heightScaleFactor;
imageViewXOrigin = - (imageViewWidth - CGRectGetWidth(rect))/2;
}
return [self imageScaledToRect:CGRectMake(imageViewXOrigin, imageViewYOrigin, imageViewWidth, imageViewHeight)];
}
希望这可以帮助别人。