在 Storyboard 中设计的自定义 UITableViewCell 中的自定义 UIView
Posted
技术标签:
【中文标题】在 Storyboard 中设计的自定义 UITableViewCell 中的自定义 UIView【英文标题】:Custom UIView in Custom UITableViewCell designed in Storyboard 【发布时间】:2016-01-19 09:34:54 【问题描述】:我正在尝试在自定义 UITableViewCells 中实现一些绘图。为此,我在单元格中添加了自定义 UIView 子类,并在自定义 UIView 子类的 drawRect 方法中实现了绘图。
这是我的方法:
我有一个带有自定义 UITableViewCells 的 UITableView。 我将 UITableViewCell 子类化,但设计直接在我的故事板中实现。单元格的内容是标准元素(UILabels 和 UIImageViews)和一个自定义 uiview 子类。
我已经使用约束和自动布局在情节提要中设置了所有内容。
自定义 uiview 子类在 drawRect 方法中包含绘图代码。
必须根据每个 UITableViewCell 的某些参数自定义绘图。 问题是,自定义 UIView 子类的正确方法是什么。
目前我得到的只是一个黑色立方体,我看不到任何绘图...背景颜色没有改变,文本也没有出现(绘图)。
编辑: 在 cellForRowAtIndexPath 中,我使用它的 initWithText: andColor: 方法创建了自定义 UIView:
- (instancetype)initWithText:(NSString *)text andColor:(UIColor *)color
NSParameterAssert(text);
self = [super init];
if (self)
self.text = text;
[self setBackgroundColor:color];
return self;
-(void)setBackgroundColor:(UIColor *)backgroundColor
self.circleColor = backgroundColor;
[super setBackgroundColor:[UIColor clearColor]];
[self setNeedsDisplay];
- (void)drawRect:(CGRect)rect
CGContextRef context = UIGraphicsGetCurrentContext();
[self.circleColor setFill];
CGContextAddArc(context, CGRectGetMidX(rect), CGRectGetMidY(rect),
CGRectGetWidth(rect)/2, 0, 2*M_PI, YES);
CGContextFillPath(context);
- (void)drawSubtractedText:(NSString *)text inRect:(CGRect)rect
inContext:(CGContextRef)context
CGContextSaveGState(context);
CGContextSetBlendMode(context, kCGBlendModeDestinationOut);
CGFloat pointSize = 8;
UIFont *font = [UIFont boldSystemFontOfSize:pointSize];
CGContextTranslateCTM(context, 0,
(CGRectGetMidY(rect) - (font.lineHeight/2)));
CGRect frame = CGRectMake(0, 0, CGRectGetWidth(rect), font.lineHeight);
UILabel *label = [[UILabel alloc] initWithFrame:frame];
label.font = font;
label.text = text;
label.textColor = [UIColor redColor];
label.textAlignment = NSTextAlignmentCenter;
label.backgroundColor = [UIColor blueColor];
[label.layer drawInContext:context];
CGContextRestoreGState(context);
【问题讨论】:
张贴一些代码或图像,说明您正在做什么以及正在发生的事情。 【参考方案1】:您会在情节提要中为标签和图像指定标签。使用这些标签并获取子视图的引用,如下所示
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
//some code
UILabel* cellDate = (UILabel *)[cellRef viewWithTag:1]
UIImageView* imageView = (UIImageView *)[cellRef viewWithTag:2]
//some code
【讨论】:
这最终会使我的 cellForRowAtIndexPath 函数膨胀。您认为在其中进行自定义绘图是个好主意吗?【参考方案2】:你做错了。您已经在故事板UITableviewCell
中添加了UIView
参考。再次,您正在为cellForRowIndexpath
方法中的同一自定义UIView
类创建一个对象。您可以做的是,从情节提要和cellforrowindexpath
方法中删除UIView
,如下所示。
CustomUIClass * c = [[CustomUIClass alloc] init];
c.frame = CGRectMake(X, Y, Width, height);
[cell.contentView addSubview:c];
这里添加你自己的帧值准备CGRect
。
【讨论】:
谢谢。看起来是一个好的开始。我试图绕过明确设置一个框架。这是否适用于约束? 您必须在 cellForRowIndexpath 方法中显式设置约束。或者,您可以做的是,让您的视图保留在情节提要中,并在 cellForRowIndexpath 中创建新视图,将其添加到情节提要视图中,而不是添加到上面指定的 cell.contentView 中。如果您遵循这种情况,情节提要的类名应该是 UIView 而不是您的自定义视图。 再次感谢。不幸的是,我最终得到了同一个 uiview 的多个“层”。 (多次创建相同的 uiview,所有实例堆叠在一起)。我正在使用 xcode 的视图调试器检查视图层次结构...以上是关于在 Storyboard 中设计的自定义 UITableViewCell 中的自定义 UIView的主要内容,如果未能解决你的问题,请参考以下文章
使用 Qt Creator 中设计的自定义小部件将页面动态添加到 QStackedWidget
使用 NSMutableArray 数据填充 UITableView 自定义单元格 - Swift
iOS 8:在界面构建器中设置的自定义标签栏项目的选定图像不起作用