代码之家  ›  专栏  ›  技术社区  ›  KingPolygon

是否将子视图添加到UICollectionViewCell子类?

  •  1
  • KingPolygon  · 技术社区  · 8 年前

    我似乎在将子视图添加到我的 UICollectionViewCell 子类。

    我有一个摘要 UI集合视图单元格 标题为的子类 MessageItem ,看起来如下:

    enter image description here

    我创建了几个继承自此的类(因为它们都对页眉和页脚使用相同的逻辑)。然而,我似乎无法将任何子视图添加到 消息项 的蓝色视图。

    例如,其中一个子视图被调用 TextItem 。我正在尝试将标签添加到它的父messageView(蓝色视图)中,但只有在UIViewController中执行时才有效 cellForItemAtIndexPath:(NSIndexPath *)indexPath 方法,而不是在我的自定义子类中。

    这就是我试图在我的子类中添加它的方式:

    - (instancetype)initWithFrame:(CGRect)frame {
    
        self = [super initWithFrame:frame];
        if (self) {
    
            //Setup Message Label
            [self setupMessageLabel];
        }
    
        return self;
    }
    
    #pragma mark - Setup Methods
    
    - (void)setupMessageLabel {
    
        NSLog(@"Setting up label");
    
        //Setup Message Label
        self.messageLabel = [TTTAttributedLabel new];
        self.messageLabel.verticalAlignment = TTTAttributedLabelVerticalAlignmentCenter;
        self.messageLabel.textInsets = UIEdgeInsetsMake(8, 8, 8, 8);
        self.messageLabel.numberOfLines = 0;
        [self.messageContentView addSubview:self.messageLabel];
        [self.messageContentView autoPinEdgesToSuperviewEdges];
    
        //Update Label Color
        self.messageLabel.backgroundColor = FlatRed;
    }
    

    注意:我没有使用故事板或xib。这可能是问题所在吗?

    使现代化

    这是我的 消息项 类被实现:

    消息项.h

    #import <UIKit/UIKit.h>
    
    @class Message;
    
    @interface MessageItem : UICollectionViewCell
    
    @property (nonatomic, strong) Message *message;
    @property (nonatomic, strong) UIView *messageContentView;
    
    @end
    

    消息项.m

    @interface MessageItem ()
    
    @property (nonatomic, strong) TTTAttributedLabel *headerLabel;
    @property (nonatomic, strong) TTTAttributedLabel *footerLabel;
    
    @end
    
    @implementation MessageItem
    @synthesize message = _message;
    
    - (instancetype)initWithFrame:(CGRect)frame {
    
        self = [super initWithFrame:frame];
        if (self) {
    
            //Setup Main View
            [self setupMainView];
        }
    
        return self;
    }
    
    #pragma mark - Setup Methods
    
    - (void)setupMainView {
    
        //Setup Header
        [self setupHeaderLabel];
    
        //Setup Message
        [self setupMessageView];
    
        //Setup Footer View
        [self setupFooterLabel];
    }
    
    - (void)setupHeaderLabel {
    
        //Setup Header Label
        self.headerLabel = [[TTTAttributedLabel alloc] initForAutoLayout];
        self.headerLabel.font = [UIFont fontWithName:@"Lato-Bold" size:12.0];
        self.headerLabel.textColor = FlatGray;
        self.headerLabel.textAlignment = NSTextAlignmentCenter;
        self.headerLabel.verticalAlignment = TTTAttributedLabelVerticalAlignmentCenter;
        self.headerLabel.textInsets = UIEdgeInsetsMake(0, 8, 0, 8);
        self.headerLabel.backgroundColor = FlatPurple;
        [self.contentView addSubview:self.headerLabel];
        [self.headerLabel autoSetDimension:ALDimensionHeight toSize:20.0];
        [self.headerLabel autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsZero excludingEdge:ALEdgeBottom];
    }
    
    - (void)setupMessageView {
    
        //Setup Message View
        self.messageContentView = [UIView new];
        self.messageContentView.backgroundColor = [UIColor blueColor];
        [self.contentView addSubview:self.messageContentView];
        [self.messageContentView autoSetDimension:ALDimensionHeight toSize:30 relation:NSLayoutRelationGreaterThanOrEqual];
        [self.messageContentView autoPinEdgeToSuperviewEdge:ALEdgeLeading];
        [self.messageContentView autoPinEdgeToSuperviewEdge:ALEdgeTrailing];
        [self.messageContentView autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.headerLabel];
    }
    
    - (void)setupFooterLabel {
    
        //Setup Footer Label
        self.footerLabel = [[TTTAttributedLabel alloc] initForAutoLayout];
        self.footerLabel.font = [UIFont fontWithName:@"Lato-Bold" size:10.0];
        self.footerLabel.textColor = FlatGray;
        self.footerLabel.backgroundColor = FlatGreen;
        self.footerLabel.textAlignment = NSTextAlignmentLeft;
        self.footerLabel.textInsets = UIEdgeInsetsMake(0, 8, 0, 8);
        [self.contentView addSubview:self.footerLabel];
        [self.footerLabel autoSetDimension:ALDimensionHeight toSize:10.0];
        [self.footerLabel autoPinEdgeToSuperviewEdge:ALEdgeLeading];
        [self.footerLabel autoPinEdgeToSuperviewEdge:ALEdgeTrailing];
        [self.footerLabel autoPinEdgeToSuperviewEdge:ALEdgeBottom];
        [self.footerLabel autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.messageContentView];
    }
    

    文本项.m

    - (instancetype)initWithFrame:(CGRect)frame {
    
        self = [super initWithFrame:frame];
        if (self) {
    
            //Setup Message Label
            [self setupMessageLabel];
        }
    
        return self;
    }
    
    
    #pragma mark - Setup Methods
    
    - (void)setupMessageLabel {
    
        //Setup Message Label
        self.messageLabel = [[TTTAttributedLabel alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];
        self.messageLabel.verticalAlignment = TTTAttributedLabelVerticalAlignmentCenter;
        self.messageLabel.textInsets = UIEdgeInsetsMake(8, 8, 8, 8);
        self.messageLabel.numberOfLines = 0;
        [self.messageContentView addSubview:self.messageLabel];
    
        //Update Label Color
        self.messageLabel.backgroundColor = FlatRed;
    }
    
    #pragma mark - Setter Methods
    
    - (void)setMessageText:(NSString *)text {
    
        //Incoming Text Message
        NSMutableAttributedString *textString = [[NSMutableAttributedString alloc] initWithString:text];
        [textString addAttribute:NSForegroundColorAttributeName value:[UIColor darkGrayColor] range:NSMakeRange(0, textString.length)];
        [textString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:16 weight:UIFontWeightLight] range:NSMakeRange(0, textString.length)];
    
        //Set Paragraph Style
        NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
        paragraphStyle.minimumLineHeight = 20;
        paragraphStyle.maximumLineHeight = 20;
        [textString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, textString.length)];
    
        //Update Message Label
        [self.messageLabel setText:textString];
    
        NSLog(@"Set Message Label Text");
    }
    
    - (void)setMessage:(Message *)message {
    
        //Super
        [super setMessage:message];
    
        //Update Message Text
        [self setMessageText:message.text];
    }
    

    这就是我的收藏视图的样子:

    enter image description here

    我至少希望messageLabel的颜色反映TextItem中的更改,但事实并非如此。

    1 回复  |  直到 8 年前
        1
  •  2
  •   dichen    8 年前

    你实施了吗 initWithCoder ?

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

    我没有你所有的代码,但你的代码在我看来不错。也许问题是你如何初始化TextItem。

    这是一个使用你的代码的演示,它对我来说很好。 https://www.dropbox.com/s/7qp9ayqnyacf57j/CustomCellView.zip?dl=0