其中突出UICollectionViewCell:委托或细胞?(Where to highlight

2019-07-21 21:30发布

根据该集合视图编程指南应该处理的细胞亮点的可视状态UICollectionViewDelegate 。 像这样:

- (void)collectionView:(PSUICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
    MYCollectionViewCell *cell = (MYCollectionViewCell*)[collectionView cellForItemAtIndexPath:indexPath];
    [cell highlight];
}

- (void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
    MYCollectionViewCell *cell = (MYCollectionViewCell*)[collectionView cellForItemAtIndexPath:indexPath];
    [cell unhighlight];
}

我不喜欢这种方法是,它增加了逻辑,这是非常具体到单元格的委托。 事实上, UICollectionViewCell独立管理其突出状态,通过highlighted属性。

不会重写setHighlighted:是清洁的解决方案呢?

- (void)setHighlighted:(BOOL)highlighted
{
    [super setHighlighted:highlighted];
    if (highlighted) {
        [self highlight];
    } else {
        [self unhighlight];
    }
}

是否有任何缺点这种方法,而不是代表的办法?

Answer 1:

由于文件说,你可以依靠highlighted特性被改变,而细胞被突出显示。 例如,下面的代码会使细胞红色突出显示时(不是其子视图虽然):

- (void)setHighlighted:(BOOL)highlighted {
    [super setHighlighted:highlighted];
    [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];

    if (self.highlighted) {
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetRGBFillColor(context, 1, 0, 0, 1);
        CGContextFillRect(context, self.bounds);
    } 
}

如果你添加了一些类似这样的背景会变成紫色(红色+不透明的蓝色):

- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewCell *cell = [colView cellForItemAtIndexPath:indexPath];
    cell.contentView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:1 alpha:0.5];
}

- (void)collectionView:(UICollectionView *)colView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewCell *cell = [colView cellForItemAtIndexPath:indexPath];
    cell.contentView.backgroundColor = nil;
}

所以,你可以同时使用两者(不一定都改变细胞的外观)。 不同的是,与委托方法你也有indexPath 。 它可能被用来创建多选(您将使用此方法与选择委托方法一起),表现出一定的预览,而细胞被突出显示,以显示一些动画与其他意见...有这个代表了不少家电在我看来的方法。

作为结论,我会离开细胞形态由电池本身和使用委托方法来处理,让控制器使一些在同一时间冷静。



Answer 2:

两种可能的方法概述如下。

细胞子类

如果从已经继承清洁方法UICollectionViewCell

class CollectionViewCell: UICollectionViewCell {

    override var highlighted: Bool {
        didSet {
            self.contentView.backgroundColor = highlighted ? UIColor(white: 217.0/255.0, alpha: 1.0) : nil
        }
    }
}

UICollectionViewDelegate

不干净,需要收集视图代表了解细胞的表示逻辑。

func collectionView(collectionView: UICollectionView, didHighlightItemAtIndexPath indexPath: NSIndexPath) {

    if let cell = collectionView.cellForItemAtIndexPath(indexPath) {
        cell.contentView.backgroundColor = UIColor(white: 217.0/255.0, alpha: 1.0) // Apple default cell highlight color
    }
}


func collectionView(collectionView: UICollectionView, didUnhighlightItemAtIndexPath indexPath: NSIndexPath) {

    if let cell = collectionView.cellForItemAtIndexPath(indexPath) {
        cell.contentView.backgroundColor = nil
    }
}


Answer 3:

嗯......因为所有的这些方法都是正确的。 我发现这似乎是一个最容易我的方式。 只是覆盖的setSelected:方法(例如改变背景颜色):

-(void)setSelected:(BOOL)selected{
    self.backgroundColor = selected?[UIColor greenColor]:[UIColor grayColor];
    [super setSelected:selected];
}

......它工作“开箱即用”(即使有collectionView.allowsMultipleSelection)



Answer 4:

请注意, UICollectionViewCellselectedBackgroundView属性。 默认情况下,它是零。 只要创建该物业的观点,当用户触摸细胞就会出现。

override func awakeFromNib() {
    super.awakeFromNib()

    let view = UIView(frame: contentView.bounds)
    view.isUserInteractionEnabled = false
    view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    view.backgroundColor = UIColor(white: 0.94, alpha: 1.0)
    selectedBackgroundView = view
}


Answer 5:

它足够用于突出显示细胞(SWIFT 4)

class MyCollectionViewCell: UICollectionViewCell {
...
    override var isHighlighted: Bool {
        didSet {
            if isHighlighted {
                self.contentView.alpha = 0.6
            }
            else {
                self.contentView.alpha = 1.0
            }
        }
    }
}


Answer 6:

由于直接从UICollectionViewCell.h拍摄-覆盖两个setSelectedsetHighlighted是正确的。 根据你的情况,你可能会考虑将自定义视图来backgroundViewselectedBackgroundView这是在选择自动交换。

// Cells become highlighted when the user touches them.
// The selected state is toggled when the user lifts up from a highlighted cell.
// Override these methods to provide custom UI for a selected or highlighted state.
// The collection view may call the setters inside an animation block.
@property (nonatomic, getter=isSelected) BOOL selected;
@property (nonatomic, getter=isHighlighted) BOOL highlighted;

// The background view is a subview behind all other views.
// If selectedBackgroundView is different than backgroundView, it will be placed above the background view and animated in on selection.
@property (nonatomic, retain) UIView *backgroundView;
@property (nonatomic, retain) UIView *selectedBackgroundView;


Answer 7:

斯威夫特3:(基于A-活的答案)

import UIKit

class MyCollectionViewCell: UICollectionViewCell {

    override var highlighted: Bool {
        didSet {
            self.setNeedsDisplay()
        }
    }

    override func drawRect(rect: CGRect) {
        super.drawRect(rect)
        myImageView.highlighted = self.highlighted
    }
}

斯威夫特4

import UIKit

class MyCollectionViewCell: UICollectionViewCell {

    override var isHighlighted: Bool {
        didSet {
            self.setNeedsDisplay()
        }
    }

    override func draw(_ rect: CGRect) {
        super.draw(rect)
        myImageView.isHighlighted = self.isHighlighted
    }
}


文章来源: Where to highlight UICollectionViewCell: delegate or cell?