UITableView 和 CALayer 混淆

发布于 2024-10-30 22:26:50 字数 1590 浏览 0 评论 0原文

我有一个非常简单的 UITableViewCell 子类。 MyTableViewCell.h

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>


@interface MyTableViewCell : UITableViewCell {
    CALayer *backgroundLayer;
}

@end

MyTableViewCell.m

#import "MyTableViewCell.h"
#import <QuartzCore/QuartzCore.h>


@implementation MyTableViewCell


- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        backgroundLayer = [[CALayer alloc] init];
        [backgroundLayer setBackgroundColor:[[UIColor yellowColor] CGColor]];
        [[self layer] addSublayer:backgroundLayer];
    }
    return self;
}


- (void)layoutSublayersOfLayer:(CALayer *)layer {
    [backgroundLayer setFrame:[layer frame]];
    [super layoutSublayersOfLayer:layer];
}


- (void)dealloc {
    [backgroundLayer release];
    [super dealloc];
}


@end

奇怪的是,结果如下:在此处输入图像描述

有人可以解释一下吗?为什么该层不在所有单元格中绘制,而仅在每隔一个单元格中绘制?

编辑:这是我的 tableView:cellForRowAtIndexPath: 方法:

static NSString *reuseIdentifier = @"cellReuseIdentifier";

MyTableViewCell *cell = (MyTableViewCell *)[aTableView dequeueReusableCellWithIdentifier:reuseIdentifier];

if (cell == nil)
    cell = [[[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier] autorelease];

return cell;

I got a very simple UITableViewCell subclass. MyTableViewCell.h:

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>


@interface MyTableViewCell : UITableViewCell {
    CALayer *backgroundLayer;
}

@end

MyTableViewCell.m:

#import "MyTableViewCell.h"
#import <QuartzCore/QuartzCore.h>


@implementation MyTableViewCell


- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        backgroundLayer = [[CALayer alloc] init];
        [backgroundLayer setBackgroundColor:[[UIColor yellowColor] CGColor]];
        [[self layer] addSublayer:backgroundLayer];
    }
    return self;
}


- (void)layoutSublayersOfLayer:(CALayer *)layer {
    [backgroundLayer setFrame:[layer frame]];
    [super layoutSublayersOfLayer:layer];
}


- (void)dealloc {
    [backgroundLayer release];
    [super dealloc];
}


@end

Bizarrely, here's the result:enter image description here.

Can someone explain this?! Why doesn't the layer paint in all cells but only every second cell?

EDIT: Here's my tableView:cellForRowAtIndexPath: method:

static NSString *reuseIdentifier = @"cellReuseIdentifier";

MyTableViewCell *cell = (MyTableViewCell *)[aTableView dequeueReusableCellWithIdentifier:reuseIdentifier];

if (cell == nil)
    cell = [[[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier] autorelease];

return cell;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

压抑⊿情绪 2024-11-06 22:26:50

使用这个方法就达到了目的:

- (void)layoutSublayersOfLayer:(CALayer *)layer {
    CGRect frame = [layer frame];
    frame.origin = CGPointZero;
    [backgroundLayer setFrame:frame];
    [super layoutSublayersOfLayer:layer];
}

Using this method did the trick:

- (void)layoutSublayersOfLayer:(CALayer *)layer {
    CGRect frame = [layer frame];
    frame.origin = CGPointZero;
    [backgroundLayer setFrame:frame];
    [super layoutSublayersOfLayer:layer];
}
绅刃 2024-11-06 22:26:50

尽管与您的问题无关,但您应该将图层添加到 [self.contentView 图层]。否则,删除滑动等编辑功能将无法正确呈现。

Although not related to your question, you should add your layers to [self.contentView layer]. Otherwise editing functionality like delete-swipe will not render correctly.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文