iOS UICollection View 탭 선택 기 구현
1.자가 적응 UICollectionViewCell
UICollection ViewCell 에 적응 하기 위해 UICollection ViewCell 과 같은 크기 의 단 추 를 놓 습 니 다.선택 하고 취소 할 때 단추 의 텍스트 색상 과 테두리 색상 을 변경 합 니 다.
#pragma mark--- cell
@implementation YLTagsCollectionViewCell
-(instancetype)initWithFrame:(CGRect)frame
{
if(self = [super initWithFrame:frame]){
self.backgroundColor = [UIColor clearColor];
_btn = [UIButton buttonWithType:UIButtonTypeCustom];
//
_btn.frame = CGRectMake(0, 0, frame.size.width, frame.size.height);
_btn.backgroundColor = [UIColor whiteColor];
_btn.titleLabel.font = [UIFont systemFontOfSize:14];
_btn.layer.borderWidth = 1.f;
_btn.layer.cornerRadius = frame.size.height/2.0;
_btn.layer.masksToBounds = YES;
[_btn setTitleColor:HEXCOLOR(0x666666) forState:UIControlStateNormal];
_btn.layer.borderColor = HEXCOLOR(0xdddddd).CGColor;
_btn.userInteractionEnabled = NO;
[self.contentView addSubview:_btn];
}
return self;
}
-(void)layoutSubviews
{
[super layoutSubviews];
_btn.frame = CGRectMake(0, 0, self.contentView.frame.size.width, self.contentView.frame.size.height);
}
-(void)setSelected:(BOOL)selected
{
[super setSelected:selected];
_btn.layer.borderColor = selected?HEXCOLOR(0xffb400).CGColor:HEXCOLOR(0xdddddd).CGColor;
[_btn setTitleColor:selected?HEXCOLOR(0xffb400):HEXCOLOR(0x666666) forState:UIControlStateNormal];
}
-(void)setHighlighted:(BOOL)highlighted
{
[super setHighlighted:highlighted];
_btn.layer.borderColor = highlighted?HEXCOLOR(0xffb400).CGColor:HEXCOLOR(0xdddddd).CGColor;
[_btn setTitleColor:highlighted?HEXCOLOR(0xffb400):HEXCOLOR(0x666666) forState:UIControlStateNormal];
}
@end
2.UICollection ViewFlowLayout 하위 클래스--YLWaterFlowLayout 의 실현헤더 파일
#import <UIKit/UIKit.h>
@class YLWaterFlowLayout;
@protocol YLWaterFlowLayoutDelegate <NSObject>
/** cell */
- (CGFloat)waterFlowLayout:(YLWaterFlowLayout *)layout
widthAtIndexPath:(NSIndexPath *)indexPath;
@end
@interface YLWaterFlowLayout : UICollectionViewFlowLayout
@property (nonatomic,assign) id<YLWaterFlowLayoutDelegate> delegate;
@property(nonatomic,assign)CGFloat rowHeight;///<
@end
파일
#import "YLWaterFlowLayout.h"
@interface YLWaterFlowLayout()
@property(nonatomic,strong)NSMutableArray *originxArray;
@property(nonatomic,strong)NSMutableArray *originyArray;
@end
@implementation YLWaterFlowLayout
#pragma mark -
- (instancetype)init {
self = [super init];
if (self) {
self.minimumInteritemSpacing = 5;// cell
self.minimumLineSpacing = 5;//
self.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10);
self.scrollDirection = UICollectionViewScrollDirectionVertical;
_originxArray = [NSMutableArray array];
_originyArray = [NSMutableArray array];
}
return self;
}
#pragma mark - ,
#pragma mark - ,
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {
return YES;
}
- (void)prepareLayout {
[super prepareLayout];
}
#pragma mark - Item layoutAttributes
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
NSArray *array = [super layoutAttributesForElementsInRect:rect];
NSMutableArray *mutArray = [NSMutableArray arrayWithCapacity:array.count];
for(UICollectionViewLayoutAttributes *attrs in array){
UICollectionViewLayoutAttributes *theAttrs = [self layoutAttributesForItemAtIndexPath:attrs.indexPath];
[mutArray addObject:theAttrs];
}
return mutArray;
}
#pragma mark - Item layoutAttributes
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
CGFloat x = self.sectionInset.left;
CGFloat y = self.sectionInset.top;
// cell x y
NSInteger preRow = indexPath.row - 1;
if(preRow >= 0){
if(_originyArray.count > preRow){
x = [_originxArray[preRow]floatValue];
y = [_originyArray[preRow]floatValue];
}
NSIndexPath *preIndexPath = [NSIndexPath indexPathForItem:preRow inSection:indexPath.section];
CGFloat preWidth = [self.delegate waterFlowLayout:self widthAtIndexPath:preIndexPath];
x += preWidth + self.minimumInteritemSpacing;
}
CGFloat currentWidth = [self.delegate waterFlowLayout:self widthAtIndexPath:indexPath];
// cell
currentWidth = MIN(currentWidth, self.collectionView.frame.size.width - self.sectionInset.left - self.sectionInset.right);
if(x + currentWidth > self.collectionView.frame.size.width - self.sectionInset.right){
// ,
x = self.sectionInset.left;
y += _rowHeight + self.minimumLineSpacing;
}
//
UICollectionViewLayoutAttributes *attrs = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
attrs.frame = CGRectMake(x, y, currentWidth, _rowHeight);
_originxArray[indexPath.row] = @(x);
_originyArray[indexPath.row] = @(y);
return attrs;
}
#pragma mark - CollectionView
- (CGSize)collectionViewContentSize
{
CGFloat width = self.collectionView.frame.size.width;
__block CGFloat maxY = 0;
[_originyArray enumerateObjectsUsingBlock:^(NSNumber *number, NSUInteger idx, BOOL * _Nonnull stop) {
if ([number floatValue] > maxY) {
maxY = [number floatValue];
}
}];
return CGSizeMake(width, maxY + _rowHeight + self.sectionInset.bottom);
}
@end
아이디어 구현:YLWaterFlowLayout 에서 origin xArray 와 originyArray 두 개의 배열 을 사용 하여 사용자 정의 YLTags Collection View Cell 의 위치 x 와 y 를 기록 합 니 다.-(UICollection View Layout Attributes*)layout Attributes Foritem AtIndexPath:(NSIndexPath*)indexPath 방법 에서 현재 YLTags Collection ViewCell 과 가 까 운'이전 YLTags Collection ViewCell'의 위치 와 사이즈 정 보 를 얻 을 수 있 습 니 다.이전 cell 의 x 에 하나의 cell width 를 더 해서 현재 cell 의 x 를 얻 을 수 있 습 니 다.또한 현재 cell 의 x+width 가 화면 오른쪽 가장 자 리 를 뛰 어 넘 을 지 판단 해 야 합 니 다.초과 하면 줄 을 바 꿔 표시 해 야 한 다 는 뜻 입 니 다.이 럴 때 y 의 값 을 수정 해 야 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.