uitabbar controller 숨김 방법
문제가 있습니다.UITabBarController
. 애플리케이션에서 숨기고 싶지만 사용하지 않습니다.hidesBottomBarWhenPushed
내가 밀었을 때 숨기고 싶지 않아서요예를 들어, 응용프로그램에서 숨기기 단추를 누를 때 숨기려고 합니다.
구글에서 기사를 많이 읽었는데 어떻게 해야 하는지 모르겠어요.
제 작업 코드에 붙여넣는 겁니다이 메서드를 호출하여 탭바 컨트롤러를 숨기고 표시할 수 있습니다.탭바 컨트롤러 인스턴스를 이 함수에 전달합니다.
// Method call
[self hideTabBar:self.tabBarController];
// Method implementations
- (void)hideTabBar:(UITabBarController *) tabbarcontroller
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
for(UIView *view in tabbarcontroller.view.subviews)
{
if([view isKindOfClass:[UITabBar class]])
{
[view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)];
}
else
{
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)];
}
}
[UIView commitAnimations];
}
- (void)showTabBar:(UITabBarController *) tabbarcontroller
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
for(UIView *view in tabbarcontroller.view.subviews)
{
NSLog(@"%@", view);
if([view isKindOfClass:[UITabBar class]])
{
[view setFrame:CGRectMake(view.frame.origin.x, 431, view.frame.size.width, view.frame.size.height)];
}
else
{
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 431)];
}
}
[UIView commitAnimations];
}
가로, 세로, 아이패드 모두에서 작동할 수 있도록 수정된 Setomidor의 답변(320 및 480 값은 아이폰에서만 작동)
- (void) hideTabBar:(UITabBarController *) tabbarcontroller
{
CGRect screenRect = [[UIScreen mainScreen] bounds];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
float fHeight = screenRect.size.height;
if( UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) )
{
fHeight = screenRect.size.width;
}
for(UIView *view in tabbarcontroller.view.subviews)
{
if([view isKindOfClass:[UITabBar class]])
{
[view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
}
else
{
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
view.backgroundColor = [UIColor blackColor];
}
}
[UIView commitAnimations];
}
- (void) showTabBar:(UITabBarController *) tabbarcontroller
{
CGRect screenRect = [[UIScreen mainScreen] bounds];
float fHeight = screenRect.size.height - tabbarcontroller.tabBar.frame.size.height;
if( UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) )
{
fHeight = screenRect.size.width - tabbarcontroller.tabBar.frame.size.height;
}
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
for(UIView *view in tabbarcontroller.view.subviews)
{
if([view isKindOfClass:[UITabBar class]])
{
[view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
}
else
{
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
}
}
[UIView commitAnimations];
}
또한 UID 장치 방향 변경으로 iOS 6에 도입된 변경 사항을 처리하고 장치가 누워있을 때도 제대로 작동하도록 코드를 수정했습니다.
단추에 대한 작업 방법:
[self.tabBarController.tabBar setHidden:YES];
Saurahb과 karlbecker_com의 솔루션은 훌륭하지만, 탭 바가 백업되는 동안 보기에 테이블 뷰가 포함되어 있을 때 분명한 팝업 효과를 일으킬 수 있습니다.몇 가지 수정을 해서 (UITabBar Controller의 범주로) 단일 기능으로 결합했습니다.완벽하지는 않지만(지연된 수정 애니메이션) 테이블로 좋은 결과를 줍니다.
애니메이션 블록과 카테고리를 좋아한다면 한번 시도해보세요.방향 설정 및 장치 친화적입니다.
UIT탭바컨트롤러+쇼HideBar.m:
#import "UITabBarController+ShowHideBar.h"
@implementation UITabBarController (ShowHideBar)
- (void) setHidden:(BOOL)hidden{
CGRect screenRect = [[UIScreen mainScreen] bounds];
float fHeight = screenRect.size.height;
if( UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) ){
fHeight = screenRect.size.width;
}
if(!hidden) fHeight -= self.tabBar.frame.size.height;
[UIView animateWithDuration:0.25 animations:^{
for(UIView *view in self.view.subviews){
if([view isKindOfClass:[UITabBar class]]){
[view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
}else{
if(hidden) [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
}
}
}completion:^(BOOL finished){
if(!hidden){
[UIView animateWithDuration:0.25 animations:^{
for(UIView *view in self.view.subviews)
{
if(![view isKindOfClass:[UITabBar class]])
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
}
}];
}
}];
}
@end
UIT탭바컨트롤러+쇼Hide Bar.h:
#import <UIKit/UIKit.h>
@interface UITabBarController (ShowHideBar)
- (void) setHidden:(BOOL)hidden;
@end
용도:
[self.tabBarController setHidden:YES];
[self.tabBarController setHidden:NO];
Saurabh의 위 답변은 풍경 방향으로도 확장할 수 있습니다.
+ (void) hideTabBar:(UITabBarController *) tabbarcontroller {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
//Support for landscape views
int orientation = [[UIDevice currentDevice] orientation];
int x_pos = 480;
if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) {
x_pos = 320;
}
for(UIView *view in tabbarcontroller.view.subviews)
{
if([view isKindOfClass:[UITabBar class]])
{
[view setFrame:CGRectMake(view.frame.origin.x, x_pos, view.frame.size.width, view.frame.size.height)];
}
else
{
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, x_pos)];
}
}
[UIView commitAnimations];
}
`
는 showTabBar() 하는 x_pos입니다.431
그리고.271
.
@karlbecker_com Answer는 아이폰4와 아이폰5 모두에 적합합니다.아래쪽에 있는 iOS7 검은색 막대에 문제가 있는 사람은 탭바 컨트롤러를 반투명으로 설정합니다.
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
// To Hide the black line in IOS7 only, this extra bit is required
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
[self.tabBarController.tabBar setTranslucent:YES];
}
iMonoTouch (Xamarin.i) 로 karlbecker_com 의 "OS를 참조합니다. 유일한 차이점은 UITabBarController에서 상속되는 클래스에 메서드를 구현했기 때문에 "에 대한 참조입니다.tabbarcontroller
" "로 대체되었습니다.this
".
public void HideTabBar()
{
var screenRect = UIScreen.MainScreen.Bounds;
float fHeight = screenRect.Height;
if(UIApplication.SharedApplication.StatusBarOrientation == UIInterfaceOrientation.LandscapeLeft
|| UIApplication.SharedApplication.StatusBarOrientation == UIInterfaceOrientation.LandscapeRight)
{
fHeight = screenRect.Width;
}
UIView.BeginAnimations(null);
UIView.SetAnimationDuration(0.4);
foreach(UIView view in this.View.Subviews)
{
if(view is UITabBar)
{
view.Frame = new RectangleF(view.Frame.X, fHeight, view.Frame.Width, view.Frame.Height);
}
else
{
view.Frame = new RectangleF(view.Frame.X, view.Frame.Y, view.Frame.Width, fHeight);
view.BackgroundColor = UIColor.Black;
}
}
UIView.CommitAnimations();
}
public void ShowTabBar()
{
var screenRect = UIScreen.MainScreen.Bounds;
float fHeight = screenRect.Height - 49f;
if(UIApplication.SharedApplication.StatusBarOrientation == UIInterfaceOrientation.LandscapeLeft
|| UIApplication.SharedApplication.StatusBarOrientation == UIInterfaceOrientation.LandscapeRight)
{
fHeight = screenRect.Width - 49f;
}
UIView.BeginAnimations(null);
UIView.SetAnimationDuration(0.4);
foreach(UIView view in this.View.Subviews)
{
if(view is UITabBar)
{
view.Frame = new RectangleF(view.Frame.X, fHeight, view.Frame.Width, view.Frame.Height);
}
else
{
view.Frame = new RectangleF(view.Frame.X, view.Frame.Y, view.Frame.Width, fHeight);
}
}
UIView.CommitAnimations();
}
iOS8에서는 설정만 하면 됩니다.hidden
소유물tabBar
스위프트에서와 마찬가지로 당신은 할 수 있습니다.
rootTabVC = UITabBarController()
rootTabVC?.tabBar.hidden = true
나는 이것을 내 안에서 합니다.didFinishLaunchingWithOptions
appdelegate
잘합니다 했던 것 . 이전 iOS 버전에서 정확하게 기억이 난다면 당신도 설정할 필요가 있다고 생각합니다.frame
tabBar
화면 밖에 있는 것으로, 그렇지 않으면.tabbar
표시되지 않지만 공간을 차지합니다.
IOS 7.1 이후 "Swift" 솔루션:
self.tabBarController?.tabBar.hidden = true // hide tabbar
self.tabBarController?.tabBar.hidden = false // show tabbar
이것이 도움이 되기를 바랍니다!
모드 뷰 컨트롤러를 누를 수 있습니다.
[self presentModalViewController:myFullscreenViewController animated:YES];
이렇게 하면 현재 보기 위에 완전히 새로운 보기 전체 화면이 만들어집니다.
을 무시하는.dismissModalViewController:animated:
아래 솔루션은 TabBar 애니메이션으로 전체 화면 모드로 전환해야 하는 것과 정확히 동일한 사용 사례에서 잘 작동합니다.
기본적으로 생각은
UITTabBar 스냅샷을 만듭니다.
스냅샷의 UI 이미지를 UImageView에 추가합니다. UITabBar와 프레임이 동일합니다.
기본 보기 크기를 조정하고 self.tabBarController에 배치합니다.보기;
UITabBar의 알파를 0.0으로 설정합니다.
UIMageView with UITabBar 스냅샷을 self.tabBarController에 배치합니다.보기;
위의 내용이 달성되면, 어떤 종류의 애니메이션이든 합니다.
#import "QuartzCore/CALayer.h" @implementation FTBFirstViewController { BOOL hidden; UIImageView *fakeTabBarImageView; UIView *viewToResize; } - (void)viewDidLoad { [super viewDidLoad]; ////////////////////////////// // Create your viewToResize ////////////////////////////// [self.view addSubview:viewToResize]; hidden = NO; } - (void)hideTabBar:(id)sender { if (!hidden) { // // to create the fake UITabBar fakeTabBarImageView = [[UIImageView alloc] initWithFrame:CGRectZero]; UIImage *fakeTabBarImage = [self imageScreenshotFromView:self.tabBarController.tabBar]; fakeTabBarImageView.image = fakeTabBarImage; fakeTabBarImageView.frame = self.tabBarController.tabBar.frame; // // to resize underlying UIView viewToResize.frame = (CGRect){viewToResize.frame.origin.x, viewToResize.frame.origin.y + 20.f, viewToResize.frame.size.width, viewToResize.frame.size.height + fakeTabBarImageView.frame.size.height}; // // to hide real UITabBar self.tabBarController.tabBar.alpha = 0.0; // // to add views in exactly this order [self.tabBarController.view addSubview:viewToResize]; [self.tabBarController.view addSubview:fakeTabBarImageView]; // // do any sort of animation [UIView animateWithDuration:0.8 animations:^{ fakeTabBarImageView.frame = (CGRect){fakeTabBarImageView.frame.origin.x, fakeTabBarImageView.frame.origin.y + fakeTabBarImageView.frame.size.height, fakeTabBarImageView.frame.size}; }]; hidden = YES; } else { [UIView animateWithDuration:0.8 animations:^{ fakeTabBarImageView.frame = (CGRect){fakeTabBarImageView.frame.origin.x, fakeTabBarImageView.frame.origin.y - fakeTabBarImageView.frame.size.height, fakeTabBarImageView.frame.size}; } completion:^(BOOL complete){ self.tabBarController.tabBar.alpha = 1.0; [fakeTabBarImageView removeFromSuperview]; fakeTabBarImageView = nil; viewToResize.frame = self.view.frame; [self.view addSubview:viewToResize]; [fakeTabBarImageView removeFromSuperview]; }]; hidden = NO; } } - (UIImage *)imageScreenshotFromView:(UIView *)aView { UIImage *viewImage; UIGraphicsBeginImageContextWithOptions(aView.bounds.size, aView.opaque, [[UIScreen mainScreen] scale]); [aView.layer renderInContext:UIGraphicsGetCurrentContext()]; viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return viewImage; }
저는 이 모든 답변을 시도해 보았지만, 그 중 어느 것도 제게 맞지 않았습니다.내 앱에는 UITabBarController가 루트 뷰로 있고 각 탭에는 UINavigationController가 있습니다.UINavigationController 중 하나에 UICollectionViewController가 맨 위 보기 컨트롤러로 있습니다.사용자가 UICollectionView에서 항목을 선택할 때 세부 보기 컨트롤러를 탐색 스택에 밀어 넣었으면 했습니다.제 상세 보기에는 하단에 도구 모음이 있었습니다.도구 모음이 이상해 보이기 때문에 도구 모음이 탭 표시줄 위에 표시되지 않도록 하고 탭 컨텍스트를 전환할 필요가 없습니다.UITToolbar와 UITabbar를 수동으로 배치하고 UITabBar Controller와 내장 UIToolbar를 사용하지 않는 것으로 쉽게 해결할 수 있었을 것입니다. 하지만 너무 리팩터링이 심하고 우아하지 않은 것 같습니다.
결국 제 솔루션은 꽤 간단했습니다. UITabBarController의 범위를 화면 하단에서 확장하는 것입니다.상세 보기 컨트롤러에 추가했습니다.
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// Extend the UITabBarController to shift the tab bar off screen
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGRect tabBarControllerFrame = self.tabBarController.view.frame;
if (animated) {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
tabBarControllerFrame.size.height = screenRect.size.height +
self.tabBarController.tabBar.frame.size.height;
[self.tabBarController.view setFrame:tabBarControllerFrame];
[UIView commitAnimations];
}
else {
tabBarControllerFrame.size.height = screenRect.size.height +
self.tabBarController.tabBar.frame.size.height;
[self.tabBarController.view setFrame:tabBarControllerFrame];
}
// Now show the toolbar
[self.navigationController setToolbarHidden:NO animated:animated];
}
- (void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
// Ensure the UITabBarController remains extended when subviews are laid out
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGRect tabBarControllerFrame = self.tabBarController.view.frame;
tabBarControllerFrame.size.height = screenRect.size.height +
self.tabBarController.tabBar.frame.size.height;
[self.tabBarController.view setFrame:tabBarControllerFrame];
}
그런 다음 사용자가 다시 UIN 탐색 컨트롤러의 맨 위로 팝업할 때 탭 바를 다시 표시하기 위해 이 내용을 맨 위 보기 컨트롤러에 추가했습니다.
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// Hide toolbar
[self.navigationController setToolbarHidden:YES animated:animated];
// Tab bar back on to screen
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGRect tabBarControllerFrame = self.tabBarController.view.frame;
if (tabBarControllerFrame.size.height != screenRect.size.height) {
if (animated) {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
tabBarControllerFrame.size.height = screenRect.size.height;
[self.tabBarController.view setFrame:tabBarControllerFrame];
[UIView commitAnimations];
}
else {
tabBarControllerFrame.size.height = screenRect.size.height;
[self.tabBarController.view setFrame:tabBarControllerFrame];
}
}
}
@Saurabh 코드의 신속하고 수정된 버전
방법
func setTabBarHidden (bool:Bool){
for view in tabBarController!.view.subviews {
if (view.isKindOfClass(UITabBar)){
let tabBar = view as! UITabBar
UIView.animateWithDuration(0.3, animations: { () -> Void in
var offset = CGFloat(50)
if (bool == false){
offset = -50;
}
tabBar.frame = CGRect(origin: CGPointMake(tabBar.frame.origin.x, tabBar.frame.origin.y + offset), size: tabBar.frame.size)
})
}
}
}
보여주기
override func viewDidLoad() {
setTabBarHidden(true)
}
감추기
override func viewWillDisappear(animated: Bool) {
setTabBarHidden(false)
}
애니메이션이 포함된 빠른 버전, 속성을 설정해야 합니다.isHideTabBar
혼자서
self.isHideTabBar = !self.isHideTabBar
UIView.animate(withDuration: 0.5, animations: {
self.tabBarController?.tabBar.frame = (self.tabBarController?.tabBar.frame.offsetBy(dx: 0, dy: self.isHideTabBar ? 100 : -100))!
})
swift 5 및 ios 14.0용 업데이트 및 작동
/*
Shows or hides the tabbar
:param: hidden whether to show or hide the tabbar
:param: animationDuration the animation's duration
*/
extension UITabBarController {
func setHidden(hidden:Bool, animationDuration:TimeInterval = 0.25) {
let screenRect = UIScreen.main.bounds
var fHeight = screenRect.size.height
if !hidden {
fHeight -= self.tabBar.frame.size.height
}
UIView.animate(withDuration: animationDuration, animations: {
for view in self.view.subviews {
if view is UITabBar {
view.frame = CGRect(
x: view.frame.origin.x,
y: fHeight,
width: view.frame.size.width,
height: view.frame.size.height)
}
}
})
}
}
보다 직접적인 포트(테스트되지 않음):
/*
Shows or hides the tabbar
:param: hidden whether to show or hide the tabbar
:param: animationDuration the animation's duration
*/
extension UITabBarController {
func setHidden(hidden:Bool, animationDuration:TimeInterval = 0.25) {
let screenRect = UIScreen.main.bounds
var fHeight = screenRect.size.height
if UIApplication.shared.statusBarOrientation.isLandscape {
fHeight = screenRect.size.width
}
if !hidden {
fHeight -= self.tabBar.frame.size.height
}
UIView.animate(withDuration: animationDuration, animations: {
for view in self.view.subviews {
if view is UITabBar {
view.frame = CGRect(
x: view.frame.origin.x,
y: fHeight,
width: view.frame.size.width,
height: view.frame.size.height)
}
else if hidden {
view.frame = CGRect(
x: view.frame.origin.x,
y: view.frame.origin.y,
width: view.frame.size.width,
height: fHeight)
}
}
}, completion: { finished in
if !hidden {
UIView.animate(withDuration: animationDuration, animations: {
for view in self.view.subviews {
if !(view is UITabBar) {
view.frame = CGRect(
x: view.frame.origin.x,
y: view.frame.origin.y,
width: view.frame.size.width,
height: fHeight)
}
}
})
}
})
}
}
탭 표시줄을 숨기는 것은 적절한 해결책이 아니며, 현재 보기 컨트롤러 보기 높이를 조정하지 않습니다.
대신, 탭 바 자체를 단순히 높이(숨기기 위해)로 변환하거나, ID를 표시로 재설정하여 변환할 수 있습니다.
extension UITabBarController {
func setBarHiddenAnimated(_ hidden:Bool) {
UIView.animate(withDuration: 0.3, animations: {
if hidden {
self.tabBar.transform = CGAffineTransform(translationX: 0, y: self.tabBar.frame.size.height)
} else {
self.tabBar.transform = CGAffineTransform.identity
}
})
}
}
애니메이션 중에 검은색 배경을 제거하려면 뷰 컨트롤러를 '아래쪽 막대 아래로 확장' 및 '불투명 막대 아래로 확장'으로 설정해야 할 수 있습니다.
언급URL : https://stackoverflow.com/questions/5272290/how-to-hide-uitabbarcontroller
'programing' 카테고리의 다른 글
클릭시 이 요소를 자바스크립트로 전달하고 클릭한 요소에 클래스를 추가하는 방법 (0) | 2023.10.23 |
---|---|
Android Retrofit 라이브러리에서 클래스의 변환기를 만들 수 없습니다. (0) | 2023.10.23 |
사이트가 주기적으로 중단되고 "Myql connect error [localhost]: (2002) Connection rejected (400)" 오류가 발생합니다. (0) | 2023.10.23 |
크기 8 - Valgrind + C의 잘못된 판독값 (0) | 2023.10.23 |
zLib을 사용하여 감압 및 팽창 (0) | 2023.10.23 |