11

我正在尝试在 UITableViewCell 的 imageView 中放置各种尺寸的图像。我异步获取图像数据,创建图像,设置 imageView 的内容模式,最后设置 imageView 的边界。但是代码似乎对我所做的任何更改都不敏感。我希望图像以 75x75 区域为中心。我为此目的编写了以下代码

UIImage* image = [UIImage imageWithData:data];
[holder.imageView setContentMode:UIViewContentModeCenter || UIViewContentModeRedraw];
[holder.imageView setImage:image];
[holder.imageView setBounds:CGRectMake(0,0,75,75)];
[holder.imageView setFrame:CGRectMake(0,0,75,75)];
[holder setNeedsLayout]; 

其中 holder 是 UITableViewCell。我得到的结果总是一样的。所有图像都有 75 像素的高度和不同的宽度。有人可以帮我解决这个问题吗?

我已经意识到设置 contentMode 和 bounds 属性对该代码没有任何影响。我在最后一行之后添加了一个 NSLog,得到的结果如下:

NSLog(@"imageview:%@ bounds and contentMode:%@ %@",[holder imageView],[holder.imageView bounds],[holder.imageView contentMode]);

图像视图:<UIImageView:0x39ab8a0;帧 = (0 0; 75 75); 不透明=否;用户交互启用 = 否;layer = <CALayer: 0x39a92b0>> bounds and contentMode:(null) (null)

仍然没有解决方案

4

5 回答 5

45

完成了,我终于找到了解决方案,不过花了我 3 个小时 =)

解决方案是更改自定义 UITableViewCell 类的 -(void)layoutSubviews 方法中的 bound、frame、contentMode 等属性。“诀窍”就是在这种方法中编写布局代码,否则代码没有任何效果。

下面的代码为我完成了工作。它使表格的行垂直对齐。

- (void)layoutSubviews {
    [super layoutSubviews];
    self.imageView.bounds = CGRectMake(0,0,75,75);
    self.imageView.frame = CGRectMake(0,0,75,75);
    self.imageView.contentMode = UIViewContentModeScaleAspectFit;

    CGRect tmpFrame = self.textLabel.frame;
    tmpFrame.origin.x = 77;
    self.textLabel.frame = tmpFrame;

    tmpFrame = self.detailTextLabel.frame;
    tmpFrame.origin.x = 77;
    self.detailTextLabel.frame = tmpFrame;

}
于 2010-06-28T11:14:37.750 回答
11

所以UITableViewCell的问题是你无法控制内置对象的大小(即imageView、contentView、accessoryView、backgroundView)。当表格更改时,您的自定义设置会被践踏。

正如 Behlul 指出的那样,您可以通过使用layoutSubviews来强制尺寸正确,但问题是每次表格滚动时都会调用 layoutSubviews 。那是很多不必要的重新布局调用。

另一种方法是将所有内容添加到contentView。同样,如果您正在自定义背景,您可以创建一个透明的backgroundView并将您的自定义背景视图(例如myBackgroundView)添加为backgroundView的子视图。

通过这种方式,您可以根据需要放置和调整项目大小。

不利的一面是不再从附件或图像视图接收库存消息。你只需要创造你自己的。

希望有帮助!

// This code is not tested
// MyCustomTableViewCell
- (id) init{
    self = [super initWithStyle: UITableViewCellStyleDefault reuseIdentifier:@"MyReuseIdentifier"];
    if(self){
        //image view
        my_image_view = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"default_image.png"]] retain];
        [my_image_view setFrame:CGRectMake(10,10,30,30)];
        [self.contentView addSubview:my_image_view];

        //labels
        my_text_label = [[[UILabel alloc] initWithFrame:CGRectMake(50,10,100,15)] retain];
        [self.contentView addSubview:my_text_label];
        //set font, etc

        //detail label
        my_detail_label = [[[UILabel alloc] initWithFrame:CGRectMake(50,25,100,15)] retain];
        [self.contentView addSubview:my_detail_label];
        //set font, etc

        //accessory view
        //Whatever you want to do here
        //attach "accessoryButtonTapped" selector to button action

        //background view
        UIView* background_view = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 50)] autorelease];
        [background_view setBackgroundColor:[UIColor greenColor]];
        background_view.layer.cornerRadius = 17;
        background_view.layer.borderWidth = 3;
        background_view.layer.borderColor = [UIColor whiteColor].CGColor;

        [self setBackgroundView:[[[UIView alloc] init] autorelease]];
        [self.backgroundView addSubview:background_view];
    }

    return self;
}

- (void) setLabelText: (NSString*) label_text{
    [my_text_label setText:label_text];
}

- (void) setDetailText: (NSString*) detail_text{
    [my_detail_label setText: detail_text];
}

- (void) accessoryButtonTapped{
    //call table view delegate's accessoryButtonTappedForRowWithIndexPath method
}
于 2012-02-16T21:09:57.737 回答
2

"UIViewContentModeCenter || UIViewContentModeRedraw" 等价于 1。它也不是位域。你想要 UIViewContentModeCenter。

UITableViewCell.imageView 由单元格管理。如果您想要自定义布局,请尝试向 contentView 添加一个视图(我猜您所说的“以 75x75 区域为中心”是什么意思):

UIImageView * iv = [[[UIImageView alloc] initWithImage:image] autorelease];
iv.frame = (CGRect){{0,0},{75,75}};
iv.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin| UIViewAutoresizingFlexibleRightMargin;
iv.contentMode = UIViewContentModeScaleAspectFit;
[holder.contentView addSubview:iv];
于 2010-06-28T12:54:02.170 回答
1

尝试将 imageView 的“contentMode”属性更改为“UIViewContentModeScaleAspectFit”或“UIViewContentModeScaleAspectFill”

于 2010-06-28T09:01:48.433 回答
0

创建 UITableViewCell 的子类:

@interface UITableViewCellSubClass : UITableViewCell

@end

@implementation UITableViewCellSubClass

- (void)layoutSubviews {
    [super layoutSubviews];
    self.imageView.frame = CGRectMake(0,4,32,32);
    self.textLabel.frame = CGRectMake(42,4,300,32);
}
@end
于 2017-05-11T03:34:50.830 回答