对于每个UIImageView,我想向其添加标签子视图。 这是我继承的形式UIImageView
-(instancetype)initWithFrame:(CGRect)frame
{
if (self=[super initWithFrame:frame]) {
self.categoryLabel=[[UILabel alloc]initWithFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, 50)];
self.categoryLabel.textAlignment=NSTextAlignmentCenter;
self.categoryLabel.font=[UIFont systemFontOfSize:20];
self.categoryLabel.textColor=[UIColor whiteColor];
[self addSubview:self.categoryLabel];
NSLog(@"%@",self.subviews);
}
return self;
}
-(void)setModel:(HorizontalModel *)model
{
_model=model;
self.categoryLabel.text=self.model.category;
[self sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"XXXXX%@",self.model.imgURL]] placeholderImage:[UIImage imageNamed:@"obama"]];
}
这是我在视图控制器中的代码。
-(void)addImage:(NSNotification *)notification
{
self.HArrayLists=notification.userInfo[@"array"];
for (int i=0; i<[self.HArrayLists count]; i++) {
JTImageView *imageView=[[JTImageView alloc] initWithFrame:CGRectMake(i*310, 0, 300, 200)];
imageView.model=[HorizontalModel restaurantsDetailWithDict: self.HArrayLists[i]];
[self.mediaScrollView addSubview:imageView];
}
self.mediaScrollView.contentSize=CGSizeMake(310*[self.HArrayLists count], 0);
}
事实证明,只有第一个imageView显示标签,而其余的imageViews只显示图像。
答案 0 :(得分:1)
我认为问题的核心是这一行:
self.categoryLabel=[[UILabel alloc]initWithFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, 50)];
您正在通过图像的x和y值偏移标签的x和y位置。这会将它们放在图像区域之外,并使用图像剪切,使它们不可见。我认为该行应该是
self.categoryLabel=[[UILabel alloc]initWithFrame:CGRectMake(0, 0, frame.size.width, 50)];
将所有标签放在每个图像的左上角。
话虽如此,我还想提供一些建议。
首先使所有变量名以小写字母开头。因此self.HArrayLists
应为self.hArrayLists
。
然后尝试使变量名称与其内容匹配。所以再看一下self.HArrayLists
,或许类似于self.imageData
。
接下来我会以不同的方式完成构图。我将UIView
添加UILabel
和UIImageView
个实例。使用这样的父视图来布局两个子视图通常可以使生活更轻松。
我还会考虑使用UICollectionView
和UICollectionViewController
而不是UIScrollView
。您需要花些时间了解集合视图的工作原理。但是,您将获得性能和更好的布局管理。
最后,研究约束。它们是构建现代应用程序的重要组成部分,可以轻松适应不同大小的屏幕,旋转和布局。
答案 1 :(得分:0)
您需要正确设置为categoryLabel
&#39; frame
。
self.categoryLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, frame.origin.y, frame.size.width, 50)];