iOS 동적 적응 탭 구현
선행 효과 도
설계 요구
1.라벨 의 너 비 는 내용 에 따라 적응 합 니 다.
2.한 줄 에 표 시 된 태그 개 수 는 동적 입 니 다.놓 을 수 있 으 면 놓 고 놓 지 못 하면 줄 을 바 꿉 니 다.
3,기본 선택 첫 번 째
4,최소한 탭 선택
사고의 방향 을 실현 하 다.
우선 이 효 과 를 보면 이 탭 은 선택 되 고 선택 되 지 않 은 상태 입 니 다.그러면 우리 가 가장 먼저 선택 한 컨트롤 은 틀림없이 UIButton 으로 이 루어 진 것 입 니 다.
이 정도 의 중점 은 라벨 이 자동 으로 줄 을 바 꿀 수 있 느 냐,아니면 스마트 하 느 냐 하 는 것 이다.한 줄 에 몇 개 를 고정 시 키 는 것 이 아니 라 모든 버튼 의 실제 너비 와 화면의 너 비 를 비교 해 보면 줄 을 바 꿔 야 하 는 지 여 부 를 판단 할 수 있다.
또 하 나 는 최소한 하나의 탭 을 선택 하 는 기능 을 처리 하 는 것 입 니 다.저 에 게 는 단 추 를 제어 하 는 userInteractionEnabled 속성 이 있 습 니 다.단 추 를 하나 눌 렀 을 때 그 단추 의 이 속성 을 NO 로 설정 하면 사용자 가 이 벤트 를 클릭 하 는 것 을 금지 합 니 다.이 럴 때 다른 단 추 는 정상적으로 선택 할 수 있 습 니 다.선택 한 버튼 이 1 개 이상 이면 아까 그 버튼 속성 을 YES 로 바 꾸 면 그 버튼 이 다시 눌 릴 수 있 습 니 다.
코드
UIView 에 계승 할 XGTagView 클래스 만 들 기
//
// XGTagView.h
//
//
// Created by xgao on 17/3/22.
// Copyright © 2017 xgao. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface XGTagView : UIView
/**
*
*
* @param frame frame
* @param tagArray
*
* @return
*/
- (instancetype)initWithFrame:(CGRect)frame tagArray:(NSMutableArray*)tagArray;
//
@property (nonatomic,retain) NSArray* tagArray;
//
@property (nonatomic,retain) UIColor* textColorSelected;
//
@property (nonatomic,retain) UIColor* textColorNormal;
//
@property (nonatomic,retain) UIColor* backgroundColorSelected;
//
@property (nonatomic,retain) UIColor* backgroundColorNormal;
@end
//
// XGTagView.m
//
//
// Created by xgao on 17/3/22.
// Copyright © 2017 xgao. All rights reserved.
//
#import "XGTagView.h"
@interface XGTagView()
@end
@implementation XGTagView
/**
*
*
* @param frame frame
* @param tagArray
*
* @return
*/
- (instancetype)initWithFrame:(CGRect)frame tagArray:(NSArray*)tagArray{
self = [super initWithFrame:frame];
if (self) {
_tagArray = tagArray;
[self setUp];
}
return self;
}
//
- (void)setUp{
//
_textColorNormal = [UIColor darkGrayColor];
_textColorSelected = [UIColor whiteColor];
_backgroundColorSelected = [UIColor redColor];
_backgroundColorNormal = [UIColor whiteColor];
//
[self createTagButton];
}
// set
- (void)setTagArray:(NSMutableArray *)tagArray{
_tagArray = tagArray;
//
[self resetTagButton];
}
- (void)setTextColorSelected:(UIColor *)textColorSelected{
_textColorSelected = textColorSelected;
//
[self resetTagButton];
}
- (void)setTextColorNormal:(UIColor *)textColorNormal{
_textColorNormal = textColorNormal;
//
[self resetTagButton];
}
- (void)setBackgroundColorSelected:(UIColor *)backgroundColorSelected{
_backgroundColorSelected = backgroundColorSelected;
//
[self resetTagButton];
}
- (void)setBackgroundColorNormal:(UIColor *)backgroundColorNormal{
_backgroundColorNormal = backgroundColorNormal;
//
[self resetTagButton];
}
#pragma mark - Private
//
- (void)resetTagButton{
//
for (UIButton* btn in self.subviews) {
[btn removeFromSuperview];
}
//
[self createTagButton];
}
//
- (void)createTagButton{
//
CGFloat btnH = 28;
//
CGFloat leftX = 6;
//
CGFloat topY = 10;
//
CGFloat marginX = 10;
//
CGFloat marginY = 10;
//
CGFloat fontMargin = 10;
for (int i = 0; i < _tagArray.count; i++) {
UIButton* btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(marginX + leftX, topY, 100, btnH);
btn.tag = 100+i;
//
if (i == 0) {
btn.selected = YES;
}
//
[btn setTitle:_tagArray[i] forState:UIControlStateNormal];
//------
//
NSMutableAttributedString* btnDefaultAttr = [[NSMutableAttributedString alloc]initWithString:btn.titleLabel.text];
//
[btnDefaultAttr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:13] range:NSMakeRange(0, btn.titleLabel.text.length)];
//
[btnDefaultAttr addAttribute:NSForegroundColorAttributeName value:self.textColorNormal range:NSMakeRange(0, btn.titleLabel.text.length)];
[btn setAttributedTitle:btnDefaultAttr forState:UIControlStateNormal];
//
[btn setBackgroundImage:[self imageWithColor:self.backgroundColorNormal] forState:UIControlStateNormal];
//-----
//
NSMutableAttributedString* btnSelectedAttr = [[NSMutableAttributedString alloc]initWithString:btn.titleLabel.text];
//
[btnSelectedAttr addAttribute:NSForegroundColorAttributeName value:self.textColorSelected range:NSMakeRange(0, btn.titleLabel.text.length)];
//
[btnSelectedAttr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:13] range:NSMakeRange(0, btn.titleLabel.text.length)];
[btn setAttributedTitle:btnSelectedAttr forState:UIControlStateSelected];
//
[btn setBackgroundImage:[self imageWithColor:self.backgroundColorSelected] forState:UIControlStateSelected];
//
btn.layer.cornerRadius = btn.frame.size.height / 2.f;
btn.layer.masksToBounds = YES;
//
btn.layer.borderColor = [UIColor lightGrayColor].CGColor;
btn.layer.borderWidth = 0.5;
// 、
[self setTagButtonMargin:btn fontMargin:fontMargin];
//
if (btn.frame.origin.x + btn.frame.size.width + marginX > self.frame.size.width) {
//
topY += btnH + marginY;
//
leftX = 6;
btn.frame = CGRectMake(marginX + leftX, topY, 100, btnH);
// 、
[self setTagButtonMargin:btn fontMargin:fontMargin];
}
//
CGRect frame = btn.frame;
frame.size.height = btnH;
btn.frame = frame;
//-----
[btn addTarget:self action:@selector(selectdButton:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:btn];
leftX += btn.frame.size.width + marginX;
}
// ,
[self checkButtonState];
}
// 、
- (void)setTagButtonMargin:(UIButton*)btn fontMargin:(CGFloat)fontMargin{
//
[btn sizeToFit];
//
CGRect frame = btn.frame;
frame.size.width += fontMargin*2;
btn.frame = frame;
}
// ,
- (void)checkButtonState{
int selectCount = 0;
UIButton* selectedBtn = nil;
for(int i=0;i < _tagArray.count; i++){
UIButton* btn = (UIButton*)[self viewWithTag:100+i];
if(btn.selected){
selectCount++;
selectedBtn = btn;
}
}
if (selectCount == 1) {
//
selectedBtn.userInteractionEnabled = NO;
}else{
//
for(int i=0;i < _tagArray.count; i++){
UIButton* btn = (UIButton*)[self viewWithTag:100+i];
if(!btn.userInteractionEnabled){
btn.userInteractionEnabled = YES;
}
}
}
}
// UIImage
- (UIImage*)imageWithColor:(UIColor*)color{
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
//
UIGraphicsBeginImageContext(rect.size);
//
[color set];
//
UIRectFill(CGRectMake(0, 0, rect.size.width, rect.size.height));
// UIImage
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
//
UIGraphicsEndImageContext();
return image;
}
#pragma mark - Event
//
- (void)selectdButton:(UIButton*)btn{
btn.selected = !btn.selected;
// ,
[self checkButtonState];
}
@end
자,여러분 이 잘 모 르 는 곳 이 있 으 면 저 에 게 메 시 지 를 남 겨 주세요.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.