我有一个是由一个自定义UICollectionViewCell子类的UICollectionView。 电池的正确显示和通过烧制这种方法正确地响应用户的触摸:
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
但是,我的理解是,当用户触摸电池,更应突出(蓝色),然后当用户提起他们的手指的亮点应该消失。 这是不会发生。 为什么有什么想法?
下面是一些相关的代码:
在UICollectionView的数据源:
@implementation SplitCheckViewCollection
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellIdentifier = @"ReceiptCellIdentifier";
SplitCheckCollectionCell *cell = (SplitCheckCollectionCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
cell.cellName.text = [NSString stringWithFormat:@"%@%i",@"#",indexPath.row+1];
return cell;
}
在UICollectionViewCell的实现:
@implementation SplitCheckCollectionCell
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"SplitCheckCollectionCell" owner:self options:nil];
if ([arrayOfViews count] < 1) {
return nil;
}
if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) {
return nil;
}
self = [arrayOfViews objectAtIndex:0];
}
return self;
}
Answer 1:
该类只告诉你的高亮度状态,但不改变外观。 你必须例如通过改变细胞的背景做编程。
细节的描述的CollectionView编程指南 。
Answer 2:
作为SAE说,你必须自己做一个子类。 其他的障碍我只是跑成是攻细胞时,它被接收的亮点,如果被按住的细胞重新划分。 但是,如果窃听快速重绘从来没有发生过。
我创造了细胞在故事板和收集视图具有“延时内容触摸”打勾作为默认值。 我取消选中这一点,它会立即显示在手指触摸屏幕。
我使用的是自定义绘制例程检查isHighlighted值。 您还需要重写自定义单元格如下setHighlighted或抽签程序不会被调用。
-(void)setHighlighted:(BOOL)highlighted
{
[super setHighlighted:highlighted];
[self setNeedsDisplay];
}
Answer 3:
有2种委托方法你应该实现:
- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath;
- (void)collectionView:(UICollectionView *)colView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath;
突出与动画集合观察室的完整代码:
- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
//set color with animation
[UIView animateWithDuration:0.1
delay:0
options:(UIViewAnimationOptionAllowUserInteraction)
animations:^{
[cell setBackgroundColor:[UIColor colorWithRed:232/255.0f green:232/255.0f blue:232/255.0f alpha:1]];
}
completion:nil];
}
- (void)collectionView:(UICollectionView *)colView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
//set color with animation
[UIView animateWithDuration:0.1
delay:0
options:(UIViewAnimationOptionAllowUserInteraction)
animations:^{
[cell setBackgroundColor:[UIColor clearColor]];
}
completion:nil ];
}
Answer 4:
您需要实现UICollectionViewDataSource如果你想在触摸到具有亮点和Unhighlight效果和触摸释放
这里是示例代码
#pragma mark - UICollectionView Datasource
- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = [UIColor colorWithRed:235/255.0f green:236/255.0f blue:237/255.0f alpha:.5];
}
- (void)collectionView:(UICollectionView *)colView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = nil;
}
Answer 5:
你可以得到一个高亮通过添加这些行到你的UICellView的设置进行绘制。
UIView* selectedBGView = [[UIView alloc] initWithFrame:self.bounds];
selectedBGView.backgroundColor = [UIColor redColor];
self.selectedBackgroundView = selectedBGView;
从“管理的选择和亮点可视化状态” ......收集意见默认支持单项选择,并且可以配置为支持多个项目选择或具有完全禁用选择。 收集视图检测抽头其边界和亮点内或相应地选择对应的小区。 在大多数情况下,所述集合视图修改的小区的唯一的属性,以指示它被选择或高亮; 它不会改变你的细胞的视觉外观,但有一个例外。 如果一个细胞的selectedBackgroundView属性包含一个有效的视图,集合视图显示了当细胞被突出显示或选择了这一观点。
Answer 6:
作为SAE指出,你必须手动完成在彰显细胞。 我发现最简单的方法是使用的tableview didHighlightRowAtIndexPath和didUnhighlightRowAtIndexPath方法来设置一个布尔“强调”在您的UICollectionCell实例,然后覆盖在子类UICollectionCell类属性。 这样做的好处是,动画已经在你身边。 你也可以做同样的一个UITableView / UITableViewCell的情况。
因此,在使用UICollectionViewDelegate方法您UICollectionView:
func collectionView(collectionView: UICollectionView, didHighlightItemAtIndexPath indexPath: NSIndexPath) {
collectionView.selectItemAtIndexPath(indexPath, animated: true, scrollPosition: UICollectionViewScrollPosition.None)
}
func collectionView(collectionView: UICollectionView, didUnhighlightItemAtIndexPath indexPath: NSIndexPath) {
collectionView.deselectItemAtIndexPath(indexPath, animated: true)
}
然后在你的UICollectionViewCell子类中添加这样的:
override var highlighted:Bool{
didSet{
println("Highlighted is set \(highlighted)")
if(highlighted == true){
self.backgroundColor = UIColor.redColor()
}else{
self.backgroundColor = UIColor.blueColor()
}
}
}
Answer 7:
你可以试试下面的代码:
- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = [UIColor blueColor];
}
和
- (void)collectionView:(UICollectionView *)colView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = nil;
}
Answer 8:
We can create our own highlight and unhighlight effect on collectionView cell by adding and removing a temporary view with some background color as follows:
-(void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *collectionViewCell = (UICollectionViewCell *)
[collectionView cellForItemAtIndexPath:indexPath];
UIView *tapHighlightView = (UIView*)[collectionViewCell.contentView
viewWithTag:10];
if (!tapHighlightView) {
tapHighlightView = [[UIView alloc]
initWithFrame:collectionViewCell.contentView.frame];
tapHighlightView.backgroundColor =[UIColor blackColor alpha:0.4];
tapHighlightView.tag = 10;
[collectionViewCell.contentView addSubview:tapHighlightView];
}
}
-(void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath{
UICollectionViewCell *collectionViewCell = (UICollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
UIView *tapHighlightView = (UIView*)[collectionViewCell.contentView viewWithTag:10];
if (tapHighlightView != nil) {
[tapHighlightView removeFromSuperview];
}
}
Answer 9:
如果你想改变视觉效果,你可以将电池设置在didHighlightItemAtIndexPath选择和取消像下面didHighlightItemAtIndexPath:
- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
- (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
[collectionView selectItemAtIndexPath:indexPath animated:YES scrollPosition:NO];
}
- (void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
[collectionView deselectItemAtIndexPath:indexPath animated:YES];
}
文章来源: Why UICollectionView's UICollectionViewCell is not highlighting on user touch?