【问题标题】:Add UIView and UILabel to UICollectionViewCell将 UIView 和 UILabel 添加到 UICollectionViewCell
【发布时间】:2014-08-21 21:32:02
【问题描述】:

我正在使用 GitHub 项目https://github.com/mayuur/MJParallaxCollectionView

我正在尝试将 UIView 和 UILabel 添加到正在显示的单元格中。我已经尝试了很多解决方案,问别人怎么做可能会更容易。

因此,有人可以将 UIView 和 UILabel 添加到 UICollectionView 以显示一些文本吗?这可以通过编程或故事板来完成,无论哪种方式适合您的风格。

我尝试在 MJCollectionViewCell.m setupImageView 方法中添加相关逻辑。另外,尝试了 MJRootViewController cellForItemAtIndexPath 方法。但我仍然无法让 UIView 和 UILabel 显示在 MJCollectionViewCell 中的 UIImage 对象上。

@property (nonatomic, strong, readwrite) UIImage *image;

MJCollectionViewCell.h

//
//  MJCollectionViewCell.h
//  RCCPeakableImageSample
//
//  Created by Mayur on 4/1/14.
//  Copyright (c) 2014 RCCBox. All rights reserved.
//

#import <UIKit/UIKit.h>
#define IMAGE_HEIGHT 200
#define IMAGE_OFFSET_SPEED 25

@interface MJCollectionViewCell : UICollectionViewCell

/*

 image used in the cell which will be having the parallax effect

 */
@property (nonatomic, strong, readwrite) UIImage *image;

/*
 Image will always animate according to the imageOffset provided. Higher the value means higher offset for the image
 */
@property (nonatomic, assign, readwrite) CGPoint imageOffset;

//@property (nonatomic,readwrite) UILabel *textLabel;
@property (weak, nonatomic) IBOutlet UILabel *textLabel;
@property (weak, nonatomic) IBOutlet UIImageView *cellImage;
@property (nonatomic,readwrite) NSString *text;
@property(nonatomic,readwrite) CGFloat x,y,width,height;
@property (nonatomic,readwrite) NSInteger lineSpacing;

@property (nonatomic, strong) IBOutlet UIView* overlayView;



@end

MJCollectionViewCell.m

 //  MJCollectionViewCell.m
    //  RCCPeakableImageSample
    //
    //  Created by Mayur on 4/1/14.
    //  Copyright (c) 2014 RCCBox. All rights reserved.
    //

    #import "MJCollectionViewCell.h"

    @interface MJCollectionViewCell()

    @property (nonatomic, strong, readwrite) UIImageView *MJImageView;

    @end

    @implementation MJCollectionViewCell

    - (instancetype)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) [self setupImageView];
        return self;
    }

    - (id)initWithCoder:(NSCoder *)aDecoder {
        self = [super initWithCoder:aDecoder];
        if (self) [self setupImageView];
        return self;
    }

    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    - (void)drawRect:(CGRect)rect
    {
        // Drawing code
    }
    */

    #pragma mark - Setup Method
    - (void)setupImageView
    {
        // Clip subviews
        self.clipsToBounds = YES;

        /*
        // Add image subview
        self.MJImageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.bounds.origin.x, self.bounds.origin.y, self.bounds.size.width, IMAGE_HEIGHT)];
        self.MJImageView.backgroundColor = [UIColor redColor];
        self.MJImageView.contentMode = UIViewContentModeScaleAspectFill;
        self.MJImageView.clipsToBounds = NO;
        [self addSubview:self.MJImageView];
        */

        //New Code in method
        // Add image subview
        self.MJImageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.bounds.origin.x, self.bounds.origin.y, self.bounds.size.width, IMAGE_HEIGHT)];
        self.MJImageView.backgroundColor = [UIColor redColor];
        self.MJImageView.contentMode = UIViewContentModeScaleAspectFill;
        self.MJImageView.clipsToBounds = NO;

        //self.overlayView.backgroundColor = [UIColor colorWithWhite:0.0f alpha:0.4f];
       // UIView *anotherView = [[UIView alloc]initWithFrame:CGRectMake(0.0, 0.0, 20.0, 20.0)];

       //  UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0.0, 0.0, 50.0, 20.0)];
       // label.text = @"Hello";

       // [anotherView addSubview:label];

        [self addSubview:self.MJImageView];
        [self addSubview:self.overlayView];
        [self addSubview:self.textLabel];
    }

    # pragma mark - Setters

    - (void)setImage:(UIImage *)image
    {
        // Store image
        self.MJImageView.image = image;

        // Update padding
        [self setImageOffset:self.imageOffset];
    }

    - (void)setImageOffset:(CGPoint)imageOffset
    {
        // Store padding value
        _imageOffset = imageOffset;

        // Grow image view
        CGRect frame = self.MJImageView.bounds;
        CGRect offsetFrame = CGRectOffset(frame, _imageOffset.x, _imageOffset.y);
        self.MJImageView.frame = offsetFrame;
    }

    //This was added from MPSkewed may need to remove if not called.
    - (void)setText:(NSString *)text{
        _text=text;

        if (!self.textLabel) {

            CGFloat realH=self.height*2/3-self.lineSpacing;
            CGFloat latoA=realH/3;

           // self.textLabel=[[UILabel alloc] initWithFrame:CGRectMake(10,latoA/2, self.width-20, realH)];
            self.textLabel.layer.anchorPoint=CGPointMake(.5, .5);
            self.textLabel.font=[UIFont fontWithName:@"HelveticaNeue-ultralight" size:38];
            self.textLabel.numberOfLines=3;
            self.textLabel.textColor=[UIColor whiteColor];
            self.textLabel.shadowColor=[UIColor blackColor];
            self.textLabel.shadowOffset=CGSizeMake(1, 1);

            self.textLabel.transform=CGAffineTransformMakeRotation(-(asin(latoA/(sqrt(self.width*self.width+latoA*latoA)))));
            [self addSubview:self.textLabel];
        }

        self.textLabel.text=text;
    }
    @end

【问题讨论】:

  • 你能把你在 MJCollectionViewCell.m 文件中使用的代码贴出来吗?
  • 为你发布了代码@Mike。
  • 在你调用[self addSubview:]这三次的地方放一个断点,然后在调试器中执行'po self.overlayView'和'po self.textLabel'。你得到了什么?
  • 您是否尝试将标签和视图连接到情节提要中的相应视图?这比以编程方式制作要容易。之后,您只需要设置属性并使类满足您的需求。
  • @Mike (lldb) po self.overlayView 返回 nil。不知道如何解决。

标签: ios objective-c uicollectionview uicollectionviewcell


【解决方案1】:

在单元格的.h中:

@property (strong, nonatomic, readonly) UILabel *label

在单元格的 .m 中:

@property (strong, nonatomic, readwrite) UILabel *label

setupImageView 方法中(您可能应该将其重命名为更通用),创建图像视图之后,如下所示:

self.label = [[UILabel alloc] initWithFrame:someFrame]; // or CGRectZero if you are using auto layout

self.label.textColor = ...; // any other setup you want to do

[self addSubview:self.label];

self.label.frame = ...; // or set it up using auto layout

在你的数据源的-collectionView:cellForItemAtIndexPath:

cell.label.text = @"some text";

这是一个简单的方法。在实践中,我可能只为字符串公开一个属性,而不是整个标签,但这取决于你在做什么以及你需要多少控制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多