根据该集合视图编程指南应该处理的细胞亮点的可视状态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:
请注意, UICollectionViewCell
有selectedBackgroundView
属性。 默认情况下,它是零。 只要创建该物业的观点,当用户触摸细胞就会出现。
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拍摄-覆盖两个setSelected
和setHighlighted
是正确的。 根据你的情况,你可能会考虑将自定义视图来backgroundView
和selectedBackgroundView
这是在选择自动交换。
// 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?