调整UITableView大小时的不需要的图像动画

时间:2013-10-31 16:32:36

标签: ios objective-c uitableview

对于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

3 个答案:

答案 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)];
}

希望这可以帮助别人。