1

对于一个 iPad 项目,我实现了一个类似 NSBrowser 的界面,它支持动态数量的列。每列由一个 UITableView 表示。

添加或删除列时,我使用 UIView 的 animateWithDuration:animations: 来更改 UITableView 的宽度。

我遇到的问题:

系统为每个表格视图单元格的 imageView 添加了不需要的帧大小动画,该动画将 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

4

3 回答 3

2

我遇到了同样的问题,并找到了这个链接(http://www.objc.io/issue-5/iOS7-hidden-gems-and-workarounds.html),其中有一个关于阻止动画的部分。

要使您的示例正常工作,请在导入语句之后的 TestTableViewController.m 顶部添加以下内容:

@interface MyTableViewCell : UITableViewCell
@end
@implementation MyTableViewCell
- (void) layoutSubviews {
    [UIView performWithoutAnimation:^{
        [super layoutSubviews];
    }];}
@end

然后将 viewDidLoad 中的以下行更改为使用 MyTableViewCell:

[self.tableView registerClass:[MyTableViewCell class] forCellReuseIdentifier:@"Cell"];

现在运行该示例,您将不再拥有不需要的图像动画。

于 2014-02-12T22:04:11.910 回答
1

这对我有帮助: 将 UIImageView ** (在 TableView 单元格中) **contentMode 设置为宽高比 Fit。

不知道为什么,但对我有用。

于 2013-10-31T17:23:59.143 回答
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)];
}

希望这可以帮助别人。

于 2014-09-03T02:01:12.903 回答