将子视图添加到另一个子视图不起作用

Posted

技术标签:

【中文标题】将子视图添加到另一个子视图不起作用【英文标题】:Adding a subview to another subview is not working 【发布时间】:2012-08-29 18:13:57 【问题描述】:

我正在尝试将标签 (headerLabel) 添加到此处的另一个子视图 (introPadTutorial),但它没有显示在屏幕上。有人可以帮我在哪里犯错吗?

//Header file

@property (nonatomic, retain) UIView *introPadTutorial;

//Implementation file

@synthesize introPadTutorial;

UIView *v = [_appDelegate getCurrentView];
CGRect tutorialFrame = [self getTableViewFrame];

introPadTutorial = [[UIView alloc] initWithFrame:CGRectMake(v.frame.size.width, 80, -tutorialFrame.size.width, v.frame.size.height)];
[introPadTutorial setBackgroundColor:[UIColor uberLightGray]];
[introPadTutorial setUserInteractionEnabled:YES];

UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 180, 180)];
[headerLabel setText:@"test test test"];
[headerLabel setBackgroundColor:[UIColor greenColor]];
[headerLabel setFont:[UIFont boldSystemFontOfSize:16.0f]];
[headerLabel setTextColor:[UIColor redColor]];
[headerLabel setShadowColor:[UIColor whiteColor]];
[headerLabel setShadowOffset:CGSizeMake(0, 1)];

[self.introPadTutorial addSubview:headerLabel];
[headerLabel release];

[v addSubview:introPadTutorial];
[introPadTutorial release];

【问题讨论】:

【参考方案1】:

不要用负宽度改变POSITION,用原点改变位置。

使用这个:

introPadTutorial = [[UIView alloc] initWithFrame:CGRectMake(v.frame.size.width - tutorialFrame.size.width, 80, tutorialFrame.size.width, v.frame.size.height)];

我认为这应该有助于使子视图真正显示出来。

【讨论】:

是的。你是对的。这段代码解决了我的问题。经验教训 - 我将不再使用负宽度(LOL)。非常感谢.... 如果您的 CGRect 为负数,请使用 CGRectStandardize 轻松修复。【参考方案2】:

可能是你的……

introPadTutorial = [[UIView alloc] initWithFrame:CGRectMake(v.frame.size.width, 80, -tutorialFrame.size.width, v.frame.size.height)];

实际上应该是……

introPadTutorial = [[UIView alloc] initWithFrame:CGRectMake(0, 80, tutorialFrame.size.width, v.frame.size.height)];

【讨论】:

感谢您的快速回复。您的建议是调整“introPadTutorial”视图。但我仍然看不到他的“HeaderLable” 你能检查一下你的 headerLabel 的框架是否在 introPadTutorial 的范围内吗?试试这个... if (CGRectContainsRect(introPadTutorial.bounds, headerLabel.frame)) NSLog("Inside"); else NSLog("外部"); 外面写着。我想这就是为什么我看不到它的原因。我怎么把它带到里面? 我不确定负宽度的用法,您可以尝试正值。还可以尝试打印 introPadTutorial.bounds 的宽度、高度等,以确定视图的大小。 是的。你是对的。经验教训 - 我将不再使用负宽度(LOL)。非常感谢....【参考方案3】:

您的introPadTutorial 视图出现了吗? initWithFrame 调用中的宽度为负数。

【讨论】:

是的,我的“introPadTutorial”视图正在显示。但是,如果我将任何子视图添加到“introPadTutorial”,则不会出现。 是的。负宽度的目的是从超级视图的右上角开始绘制视图。 @Kishore 也许你需要做“self.introPadTutorial = [[UIView”。可能会遇到范围界定问题。 我已经尝试过使用“self.introPadTutorial”。它没有帮助。

以上是关于将子视图添加到另一个子视图不起作用的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式使用自动布局将子视图添加到 UICollectionView 不起作用

无法将子视图添加到我的 UIView

尝试添加为子视图时,ScrollView 不起作用

添加子视图后 setNeedsDisplay 不起作用

UIButton 作为 MKAnnotationView 的子视图不起作用

当滚动视图子视图不在屏幕上时,手势识别器不起作用