iOS 사용자 정의 UITabBar 와 레이아웃 설명
우리 의 프로젝트 는'백 번 생각해 도 누나 가 안 된다'는 앱 의 기능 모듈 을 모방 하여 학습 하고 향상 시 키 는 것 입 니 다.TabBar 의 스타일 은 웨 이 보 의 스타일 과 대체적으로 비슷 합 니 다(위의 그림 오른쪽 그림 참조).가장 중간 에 있 는 Tab 버튼 도 게시 기능 입 니 다.또한 현재 페이지 에 편집 발표 페이지 를 직접 덮어 서 발표 가 완료 되 거나 취소 한 후에 다시 이전 페이지 로 돌아 갑 니 다.전환 이 진행 되 지 않 았 습 니 다.
해결 방안
시 나 웨 이 보 와 우리 프로젝트 의 이런 상황 에 대해 두 가지 해결 방향 이 있다.
TabBarItem 5 개 를 정의 한 다음 TabBar 에 TabBarItem 등 크기 의 게시 단 추 를 맨 가운데 에 추가 하고 클릭 이 벤트 를 추가 합 니 다.크기 가 같 기 때문에 새 단 추 는 맨 가운데 TabBarItem 을 완전히 덮어 씁 니 다.맨 가운데 TabBarItem 의 응답 이벤트 도 차 단 됩 니 다.단 추 를 누 르 면 사용자 정의 TabBar 에 응답 하고 다시 쓰기 때 문 입 니 다. layoutSubviews 방법 은 4 개의 TabBarItem 의 레이아웃 과 크기 를 수정 하고 중간 을 비 운 다음 사용자 정의[발표]단 추 를 추가 하여 이 벤트 를 클릭 하면 컨트롤 실현 방안 을 1 로 덮어 쓸 수 있 습 니 다.
이런 방안 의 사고방식 은 위 에서 이미 말 했 듯 이 먼저 한 자 리 를 차지 한 다음 에 하나의 버튼 으로 그 위 에 덮 는 것 이다.주요 단점 은 위치 와 컨트롤 러 를 먼저 신청 해 야 하 는 것 이 낭비 적 이 고 각 컨트롤 러 의 크기 가 균일 한 상황 에 만 적용 된다 는 것 이다.우리 가 필요 로 하 는 모든 TabBarItem 의 규격 과 사이즈 가 다 를 때 우 리 는 이런 방안 을 사용 하여 실현 할 수 없다.
몇 가지 설명 할 만 한 것 이 있다.
모든 UITab BarItem 의 문자 속성 을 설정 하 는 것 은 이전 글 에서 언급 되 었 습 니 다.[발표]버튼 의 초기 화 는 하나의 예 모드 로 만들어 야 합 니 다.저희 프로젝트 에[발표]버튼 이 하나 밖 에 없 기 때문에 하나의 예 모드 를 사용 하 는 것 이 합 리 적 입 니 다.본 고 는 게 으 른 로 딩 방식 으로 하나의 예 모드 를 만 듭 니 다. viewWillAppear: 버튼 추가 [self.tabBar addSubview:self.publishButton]; 。왜 viewWillAppear: [발표]버튼 을 추가 합 니 다. viewDidLoad 첨가근본 적 인 원인 은 TabBarItem 이 TabBar 에 불 러 온 것 입 니 다. viewDidLoad 그 후에 실 행 된 것 은 다음 두 번 째 부분 에서 이 점 을 검증 했다. 지난 글 에서 tabbarcontroller 는 컨트롤 러 를 만 들 때 view didLoad 를 불 러 옵 니 다.따라서[발표]단 추 를 추가 하면 view DidLoad 에서[발표]단 추 는 TabBar 에서 첫 번 째 로 추 가 됩 니 다.그러면[발표]단 추 는 TabBarItem 에 의 해 덮어 집 니 다.그러면 우 리 는 우리 의 목적 을 달성 할 수 있 습 니 다.
#import "XMGTabBarController.h"
@interface XMGTabBarController ()
/** */
@property (nonatomic, strong) UIButton *publishButton;
@end
@implementation XMGTabBarController
#pragma mark -
- (void)viewDidLoad {
[super viewDidLoad];
/**** UITabBarItem ****/
UITabBarItem *item = [UITabBarItem appearance];
//
NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];
normalAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:14];
normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];
[item setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];
//
NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];
selectedAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor];
[item setTitleTextAttributes:normalAttrs forState:UIControlStateSelected];
/**** ****/
[self setupOneChildViewController:[[UITableViewController alloc] init] title:@" " image:@"tabBar_essence_icon" selectedImage:@"tabBar_essence_click_icon"];
[self setupOneChildViewController:[[UITableViewController alloc] init] title:@" " image:@"tabBar_new_icon" selectedImage:@"tabBar_new_click_icon"];
//
[self setupOneChildViewController:[[UIViewController alloc] init] title:nil image:nil selectedImage:nil];
[self setupOneChildViewController:[[UIViewController alloc] init] title:@" " image:@"tabBar_friendTrends_icon" selectedImage:@"tabBar_friendTrends_click_icon"];
[self setupOneChildViewController:[[UITableViewController alloc] init] title:@" " image:@"tabBar_me_icon" selectedImage:@"tabBar_me_click_icon"];
}
/**
* viewWillAppear: ?
* viewWillAppear: , tabBar 5 UITabBarButton
* : [ ] UITabBarButton
*/
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
/**** ****/
[self.tabBar addSubview:self.publishButton];
}
#pragma mark -
/** */
- (UIButton *)publishButton
{
if (!_publishButton) {
_publishButton = [UIButton buttonWithType:UIButtonTypeCustom];
_publishButton.backgroundColor = XMGRandomColor;
[_publishButton setImage:[UIImage imageNamed:@"tabBar_publish_icon"] forState:UIControlStateNormal];
[_publishButton setImage:[UIImage imageNamed:@"tabBar_publish_click_icon"] forState:UIControlStateHighlighted];
_publishButton.frame = CGRectMake(0, 0, self.tabBar.frame.size.width / 5, self.tabBar.frame.size.height);
_publishButton.center = CGPointMake(self.tabBar.frame.size.width * 0.5, self.tabBar.frame.size.height * 0.5);
[_publishButton addTarget:self action:@selector(publishClick) forControlEvents:UIControlEventTouchUpInside];
}
return _publishButton;
}
#pragma mark -
/**
*
*/
- (void)publishClick
{
XMGLogFunc
XMGTestViewController *test = [[XMGTestViewController alloc] init];
[self presentViewController:test animated:YES completion:nil];
}
@end
2 사용자 정의 TabBar사용자 정의 TabBar 는 우리 의 요구 에 따라 TabBar 의 하위 컨트롤 의 속성 과 레이아웃 을 완전히 배치 하고 설정 할 수 있 습 니 다.
@interface XMGTabBarController ()
@end
@implementation XMGTabBarController
#pragma mark -
- (void)viewDidLoad {
[super viewDidLoad];
/**** UITabBarItem ****/
//
/**** ****/
[self setupOneChildViewController:[[UITableViewController alloc] init] title:@" " image:@"tabBar_essence_icon" selectedImage:@"tabBar_essence_click_icon"];
[self setupOneChildViewController:[[UITableViewController alloc] init] title:@" " image:@"tabBar_new_icon" selectedImage:@"tabBar_new_click_icon"];
[self setupOneChildViewController:[[UIViewController alloc] init] title:@" " image:@"tabBar_friendTrends_icon" selectedImage:@"tabBar_friendTrends_click_icon"];
[self setupOneChildViewController:[[UITableViewController alloc] init] title:@" " image:@"tabBar_me_icon" selectedImage:@"tabBar_me_click_icon"];
/**** TabBar ****/
[self setValue:[[XMGTabBar alloc] init] forKeyPath:@"tabBar"];
}
@end
다음 코드 는 TabBar 의.m 파일 을 사용자 정의 하 는 주요 내용 입 니 다.주로 다시 쓰 는 것 입 니 다. layoutSubviews 방법,이 방법 에서 우 리 는 네 개의 단추 의 크기 와 레이아웃 을 조정 한 다음 에 가장 중간 에[발표]단 추 를 추가 합 니 다.마찬가지 로 몇 가지 주의해 야 할 것 도 있다.[발표]버튼 의 초기 화 는 위 와 같 습 니 다.단일 모드 로 초기 화 해 야 합 니 다.구체 적 으로 전개 되 지 않 습 니 다.다시 쓴다 layoutSubviews 방법 은 먼저 아버지 류 의 이 방법 을 사용 해 야 한다. [super layoutSubviews]; ,이렇게 하면 먼저 TabBarItem 을 배치 한 다음 에 이 구 조 를 바탕 으로 구 조 를 조정 할 수 있다.부모 클래스 레이아웃 방법 을 호출 하 는 문 구 는 뒤에 놓 을 수 없고 생략 할 수 없습니다.이 방법 은 TabBarItem 을 레이아웃 하 는 것 외 에 다른 설정 이 많 기 때 문 입 니 다.통과 하 다. self.subviews 현재 하위 컨트롤 을 가 져 옵 니 다.현재 하위 컨트롤 의 종류 와 수량 을 인쇄 한 다음 에 수정 해 야 할 컨트롤 을 적당 하 게 선별 하여 배치 할 수 있 습 니 다.저 희 는 보통 KVC 방법 으로 가 져 오고 수정 할 수 있 습 니 다.예 를 들 어 위 에서 현재 TabBar 를 수정 합 니 다. [self setValue:[[XMGTabBar alloc] init] forKeyPath:@"tabBar"]; ,속성 과 구성원 변 수 를 어떻게 얻 는 지 에 대해 참고 할 수 있 습 니 다iOS 프로젝트-기본 프레임 워 크 구축
#import "XMGTabBar.h"
@interface XMGTabBar()
/** */
@property (nonatomic, weak) UIButton *publishButton;
@end
@implementation XMGTabBar
#pragma mark -
/** */
- (UIButton *)publishButton
{
if (!_publishButton) {
UIButton *publishButton = [UIButton buttonWithType:UIButtonTypeCustom];
publishButton.backgroundColor = XMGRandomColor;
[publishButton setImage:[UIImage imageNamed:@"tabBar_publish_icon"] forState:UIControlStateNormal];
[publishButton setImage:[UIImage imageNamed:@"tabBar_publish_click_icon"] forState:UIControlStateHighlighted];
[publishButton addTarget:self action:@selector(publishClick) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:publishButton];
_publishButton = publishButton;
}
return _publishButton;
}
#pragma mark -
/**
*
*/
- (void)layoutSubviews
{
[super layoutSubviews];
/**** UITabBarButton frame ****/
//
CGFloat buttonW = self.frame.size.width / 5;
CGFloat buttonH = self.frame.size.height;
CGFloat buttonY = 0;
//
int buttonIndex = 0;
for (UIView *subview in self.subviews) {
// UITabBarButton
// if (![@"UITabBarButton" isEqualToString:NSStringFromClass(subview.class)]) continue;
if (subview.class != NSClassFromString(@"UITabBarButton")) continue;
// frame
CGFloat buttonX = buttonIndex * buttonW;
if (buttonIndex >= 2) { // 2 UITabBarButton
buttonX += buttonW;
}
subview.frame = CGRectMake(buttonX, buttonY, buttonW, buttonH);
//
buttonIndex++;
}
/**** frame ****/
self.publishButton.frame = CGRectMake(0, 0, buttonW, buttonH);
self.publishButton.center = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.5);
}
#pragma mark -
- (void)publishClick
{
XMGLogFunc
}
@end
현재 1 에서 TabBar 가 언급 되 어 있 는 TabBar Item 을 불 러 오 는 것 을 검증 하기 위해 서 는 viewDidLoad 그 다음 에 실 행 했 습 니 다.TabBar 를 사용자 정의 할 때 정지점 디 버 깅 을 했 는데 XMG tabar Controller 를 먼저 실행 한 것 이 확실 합 니 다. viewdLoad 방법,그리고 사용자 정의 TabBar 를 실행 합 니 다. layoutSubviews 방법3 붉 은 점 알림 추가
현재 많은 App 의 Tab BarItem 은 새로운 소식 이 있 을 때 오른쪽 상단 에 빨 간 점 알림 이 있 습 니 다.어떤 것 은 구체 적 인 숫자 알림 도 있 습 니 다.우리 가 자주 사용 하 는 QQ,위 챗,웨 이 보,톱기사 등 과 비슷 한 기능 이 있 습 니 다.이 힌트 는 iOS 에서 학명 을 badge 라 고 합 니 다.iOS 의 TabBarItem 은 이 속성 과 컨트롤 을 자체 적 으로 가지 고 있 습 니 다.저 희 는 자신의 수요 에 따라 설정 할 수 있 습 니 다.아래 그림 은 iOS 11 의 설정 문서 입 니 다.알림 수량,색상 을 사용자 정의 로 설정 할 수 있 고 알림 문자 의 속성 을 서로 다른 상태 에서 설정 할 수 있 습 니 다.
iOS 10 이전에 badge 의 알림 색상 을 설정 할 수 없다 고 합 니 다.이 럴 때 필요 하 다 면 TabBarItem 을 사용자 정의 한 다음 에 사용자 정의 badge 를 설정 할 수 밖 에 없습니다.본 고 는 이 점 에 대해 상세 하 게 설명 하지 않 고 필요 한 동료 가 있 으 면 스스로 어머니 에 게 도움 을 청 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.