UICollectionView标题重叠

时间:2015-06-01 18:22:15

标签: ios objective-c uicollectionview uicollectionviewcell uicollectionviewlayout

我有一个带有以下相关方法的collectionView:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
           viewForSupplementaryElementOfKind:(NSString *)kind
                                 atIndexPath:(NSIndexPath *)indexPath {

    if (kind == UICollectionElementKindSectionHeader) {
    Scoreboard *thisScoreboard = [self.scoreboards objectAtIndex:indexPath.section];

    ScoreboardReusableView *view = nil;

    view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader
                                              withReuseIdentifier:@"scoreboardHeader"
                                                     forIndexPath:indexPath];

    //view.backgroundColor = [UIColor yellowColor];

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 20)];
    //label.text = [NSString stringWithFormat:@"%@ vs %@", thisScoreboard.awayteam, thisScoreboard.hometeam];
    label.text = [NSString stringWithFormat:@"%ld", (long)indexPath.section];


    [view addSubview:label];

    return view;
    }
    return nil;
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section
{
    return CGSizeMake(self.view.frame.size.width, 34);
}

但是,标签文字重叠。以下是collectionView的两个屏幕截图。第0节和第1节(注意文本不重叠的方式):

enter image description here

第2和第3部分(文本重叠在此处以及所有后续部分标题上): enter image description here

我的标题xib ScoreboardReusableView完全空白,因为无论我放入它(例如,UILabel或UIImageView,它都不会显示在UICollectionView标头中)。我最好在xib中设计标题,但由于那不起作用,我尝试以编程方式进行,但现在标签重叠了。

4 个答案:

答案 0 :(得分:1)

集合视图重用单元格和标题。当标题在屏幕外滚动时,它将被添加到队列中,并将重新用于下一个标题以在屏幕上滚动。这意味着collectionView:viewForSupplementaryElementOfKind:方法中的配置代码将在不同indexPaths的同一标头视图上再次运行。由于您每次配置代码运行时都只是添加标签,因此它们会将一个标签叠加在另一个之上。

正确的方法是在headerView上有一个label属性,以便可以更改其文本。但...

  

无论我放入它(例如,UILabel或UIImageView),它都不会出现

这是你真正的问题。你在xib上启用了autolayout吗?如果是这样,请务必为标签添加约束,否则它将具有零宽度和高度,从而产生您描述的效果。

答案 1 :(得分:0)

ScoreboardReusableView是空白但可以重复使用。您必须将UILabel放入标题xib并在此之后为其设置文本。

例如:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {

    if (kind == UICollectionElementKindSectionHeader) {
        Scoreboard *thisScoreboard = [self.scoreboards objectAtIndex:indexPath.section];

        ScoreboardReusableView *view = nil;

        view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader
                                          withReuseIdentifier:@"scoreboardHeader"
                                                 forIndexPath:indexPath];

        view.label.text = [NSString stringWithFormat:@"%ld", (long)indexPath.section];

        return view;
    }
    return nil;
}

答案 2 :(得分:0)

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    if ([kind isEqualToString:UICollectionElementKindSectionHeader]) {

    UICollectionReusableView *reusableview=nil;
    reusableview = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];

    NSArray *viewsToRemove = [reusableview subviews];
    for (UIView *v in viewsToRemove) {
        [v removeFromSuperview];
    }

    if (reusableview==nil) {
        reusableview=[[UICollectionReusableView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 30)];
    }
    reusableview.backgroundColor=[UIColor colorWithRed:234.0/255.0 green:234.0/255.0 blue:234.0/255.0 alpha:1.0];

    UILabel *lblTitle=[[UILabel alloc] initWithFrame:CGRectMake(10, 0, [UIScreen mainScreen].bounds.size.width-90, 30)];
    [lblTitle setFont:[UIFont fontWithName:@"Ubuntu-Light" size:12]];

    lblTitle.textColor=HTAtHomeColor;
    [reusableview addSubview:lblTitle];

    UILabel *lblCount=[[UILabel alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width-80, 0, 70, 30)];
    lblCount.textAlignment=NSTextAlignmentRight;
    lblCount.textColor=[UIColor blackColor];
    [lblCount setFont:[UIFont fontWithName:@"Ubuntu-Light" size:12]];
     lblCount.text=[NSString stringWithFormat:@"%d Section Header",indexPath.row];


    [reusableview addSubview:lblCount];

    return reusableview;
}
return nil;
}

答案 3 :(得分:0)

Swift 3版本,希望有所帮助

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    var reusableview: UICollectionReusableView?
    reusableview = nil
    reusableview = playersCollectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "collViewHeader", for: indexPath as IndexPath)
    if kind == UICollectionElementKindSectionHeader {

        //remove all previous subviews:
        if let views = reusableview?.subviews {
            for view in views {
                view.removeFromSuperview()
            }
        }
        //----------

        if reusableview == nil {
            reusableview = UICollectionReusableView.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 50))
        }

        //init label
        let label = UILabel.init(frame: CGRect(x: 10.0, y: 20.0, width: self.view.frame.width-20, height: 25.0)) //-20 from width to make it no go out of screen bounds
        label.textColor = UIColor.blue //you may set your color here :)
        label.adjustsFontSizeToFitWidth = true
        label.text = "your text here"

        reusableview?.addSubview(label)
    }
    return reusableview!
}