developer tip

UITabBar 높이 변경

copycodes 2020. 12. 2. 21:29
반응형

UITabBar 높이 변경


내가 사용하는 UITabBarController루트보기 및 응용 프로그램이 지원하는 아이폰 OS 6 이상으로. 프로젝트 클래스 계층 구조는 다음과 같습니다.

UITabBarController
  - tab1
    - UINavigationController
      - UIViewController
      - UIViewController
      .
      .
  - tab2
    - UINavigationController
      - UIViewController
      - UIViewController
      .
      .
      .
  - tab3
    - UIViewController
  - tab4
    - UIViewController

위의 계층 구조에서 UITabBar내부에있는 UIViewController 중 하나에서 높이를 변경하기 위해 아래 코드를 사용했습니다 UINavigationController.

CGRect tabbarFrame = self.tabBarController.tabBar.frame;
tabbarFrame.size.height += 60;
self.tabBarController.tabBar.frame = tabbarFrame;

그러나 높이는 변하지 않습니다. UITabBar기본 높이로 표시됩니다. 값을 로깅하면 아래와 같이 변경된 값을 출력합니다.

<UITabBar: 0xb528f60; frame = (0 431; 320 109); autoresize = W+TM; layer = <CALayer: 0xb529080>>

UITabBar이 같은 것을 달성하기 위해의 높이를 어떻게 변경할 수 있습니까 ?

여기에 이미지 설명 입력


나는이 문제에 직면했고 그것을 해결할 수 있었다.

클래스의 하위 클래스에 다음 코드를 추가해야합니다 UITabBarController.

const CGFloat kBarHeight = 80;

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];

    CGRect tabFrame = self.tabBar.frame; //self.TabBar is IBOutlet of your TabBar
    tabFrame.size.height = kBarHeight;
    tabFrame.origin.y = self.view.frame.size.height - kBarHeight;
    self.tabBar.frame = tabFrame;
}

빠른:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    tabBar.frame.size.height = kBarHeight
    tabBar.frame.origin.y = view.frame.height - kBarHeight
}

들어 아이폰 OS 8.2 , 엑스 코드 6.2 스위프트 언어 :

UITabBarController(유형 UITabBarController)에 대한 "DNMainTabVC.swift"(DeveloperNameMainTabViewController.swift 파일)를 생성하고 스토리 보드 VC에 연결합니다.

다음 행을 추가하십시오.

override func viewWillLayoutSubviews() {
    var tabFrame = self.tabBar.frame
    // - 40 is editable , the default value is 49 px, below lowers the tabbar and above increases the tab bar size
    tabFrame.size.height = 40
    tabFrame.origin.y = self.view.frame.size.height - 40
    self.tabBar.frame = tabFrame
}

이것은 나를 위해 일했습니다.


Swift3.0, Swift 4.0 호환

iPhone X 이전 기본 탭 막대 높이 : 49pt

iPhone X 기본 탭 막대 높이 : 83pt

iPhone X 화면 크기를 포함한 모든 iOS 기기를 지원하는 범용 솔루션 은 다음과 같습니다.

  1. UITabBar의 기본 높이 캡처 :

    fileprivate lazy var defaultTabBarHeight = { tabBar.frame.size.height }()
    
  2. UITabBar의 높이 조정 :

        override func viewWillLayoutSubviews() {
            super.viewWillLayoutSubviews()
    
            let newTabBarHeight = defaultTabBarHeight + 16.0
    
            var newFrame = tabBar.frame
            newFrame.size.height = newTabBarHeight
            newFrame.origin.y = view.frame.size.height - newTabBarHeight
    
            tabBar.frame = newFrame
        }
    

유형의 사용자 지정 하위 클래스를 UITabBar만든 후 다음 메서드를 구현합니다.

@implementation CustomTabBar
#define kTabBarHeight = // Input the height we want to set for Tabbar here
-(CGSize)sizeThatFits:(CGSize)size
{
    CGSize sizeThatFits = [super sizeThatFits:size];
    sizeThatFits.height = kTabBarHeight;

    return sizeThatFits;
}
@end

이것이 효과가 있기를 바랍니다.


XCode 9.0Swift 4 에서 테스트 됨

이전 답변에서 제안 - 상속 UITabBar및 재정의 sizeThatFits,하지만 마크 height와 같은 @IBInspectable, 그것이 설정 될 수 있도록 인터페이스 빌더 :

import UIKit

class CustomTabBar : UITabBar {
    @IBInspectable var height: CGFloat = 0.0

    override func sizeThatFits(_ size: CGSize) -> CGSize {
        var sizeThatFits = super.sizeThatFits(size)
        if height > 0.0 {
            sizeThatFits.height = height
        }
        return sizeThatFits
    }
}

Identity Inspector (⌥⌘3) 에서 CustomTabBar클래스 설정 :UITabBar

탭 표시 줄 ID 검사기

그런 다음 Attributes Inspector (⌥⌘4) 에서 원하는 값 Height(보다 큼 0.0)을 설정합니다 .

탭 표시 줄 속성 검사기


Swift 4의 경우

extension UITabBar {

     override open func sizeThatFits(_ size: CGSize) -> CGSize {
     var sizeThatFits = super.sizeThatFits(size)
     sizeThatFits.height = 60 // adjust your size here
     return sizeThatFits
    }
 }

스위프트 2.0 :

var tabBar:UITabBar?

override func viewWillLayoutSubviews() {
    var tabFrame: CGRect = self.tabBar!.frame
    tabFrame.size.height = 60
    tabFrame.origin.y = self.view.frame.size.height - 60
    self.tabBar!.frame = tabFrame
}

Swift 3.0+ 아래 코드에서 원하는 높이로 200을 교체하십시오.

   extension UITabBar {
        override open func sizeThatFits(_ size: CGSize) -> CGSize {
            return CGSize(width: UIScreen.main.bounds.width, height: 200)
        }
    }

Swift 4 및 iphone x와 호환

class CustomTabBar : UITabBar {

@IBInspectable var height: CGFloat = 65.0

override open func sizeThatFits(_ size: CGSize) -> CGSize {
    guard let window = UIApplication.shared.keyWindow else {
        return super.sizeThatFits(size)
    }
    var sizeThatFits = super.sizeThatFits(size)
    if height > 0.0 {

        if #available(iOS 11.0, *) {
            sizeThatFits.height = height + window.safeAreaInsets.bottom
        } else {
            sizeThatFits.height = height
        }
    }
    return sizeThatFits
}
}

이전 답변을 구축하고 Swift 3을 업데이트합니다.

UITabController를 하위 클래스로 만들고 UITabController의 Identity Inspector에 새 사용자 지정 클래스를 할당해야합니다.

스위프트 3.0

class MainTabBarController: UITabBarController {

    override func viewWillLayoutSubviews() {
        var newTabBarFrame = tabBar.frame

        let newTabBarHeight: CGFloat = 60
        newTabBarFrame.size.height = newTabBarHeight
        newTabBarFrame.origin.y = self.view.frame.size.height - newTabBarHeight

        tabBar.frame = newTabBarFrame
    }
}

Warning: if you get a blank space below your tab bar, make sure you did put this code in viewWillLayoutSubviews() and not viewDidLoad().


Xamarin implementation:

public override void ViewWillLayoutSubviews()
{
    base.ViewWillLayoutSubviews();
    const float newTabBarHeight = 40f;
    TabBar.Frame = new CGRect(TabBar.Frame.X, TabBar.Frame.Y + (TabBar.Frame.Height - newTabBarHeight), TabBar.Frame.Width, newTabBarHeight);
}

For some reason, the answer from @Rushikesh was working pretty well until iOS 10 but I had some issues with iOS 11 and Swift 3.2.

The tabBar was changing its frame every time I touched a new tab.

I fixed this by putting the code in the viewDidLayoutSubviews() function instead of viewWillLayoutSubviews()

Swift 3 :

override func viewDidLayoutSubviews() {

    super.viewDidLayoutSubviews()
    var tabFrame            = tabBar.frame
    tabFrame.size.height    = 65
    tabFrame.origin.y       = view.frame.size.height - 65
    tabBar.frame            = tabFrame
}

You can modify the tab bar's height by subclassing it. I actually did this long time ago. xcode 6.0

override func sizeThatFits(_ size: CGSize) -> CGSize {
    return CGSize(width: super.sizeThatFits(size).width, height: 60)
}

That should return its default width with the height of 60pts.


this is also one way to do that

extension UITabBar {

override public func sizeThatFits(size: CGSize) -> CGSize {
    super.sizeThatFits(size)
    var sizeThatFits = super.sizeThatFits(size)
    sizeThatFits.height = 71
    return sizeThatFits
} }

모든 화면 크기로 작동 : tabBarHeight를 (tabBar의 원래 높이-20)로 설정하는 것이 중요하므로 나중에 viewDidLayoutSubviews에서 사용할 수 있으며 원하는 크기를 하드 코딩하는 것보다 낫습니다. 이 크기는 모든 화면에서 작동하지 않을 수 있습니다.

창 안전 영역 삽입은 화면 하단 가장자리로부터의 거리를 유지하기 위해 탭 막대 높이 하단에 필요한 패딩을 유지합니다.

var tabBarHeight = CGFloat()

override func viewDidLoad() {
        super.viewDidLoad()
        tabBarHeight = self.tabBar.frame.height - 20
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        var tabFrame = self.tabBar.frame
        guard let window = UIApplication.shared.keyWindow else {return}
        tabFrame.size.height = tabBarHeight + window.safeAreaInsets.bottom
        self.tabBar.frame = tabFrame
    }

Safe Area를 사용하여 Kiarash Asar의 답변을 수정했습니다.

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    var safeAreaBottomInset: CGFloat = 0.0

    if #available(iOS 11.0, *) {
        safeAreaBottomInset = view.safeAreaInsets.bottom
    }

    let newTabBarHeight: CGFloat = {{myDesiredHeight}} + safeAreaBottomInset

    var newFrame = tabBar.frame
    newFrame.size.height = newTabBarHeight
    newFrame.origin.y = view.frame.size.height - newTabBarHeight

    tabBar.frame = newFrame
}

iPhoneX는 높이가 다르기 때문에 더 작은 높이로 이동하면 iPhoneX에서 탭바 모양이 나빠집니다.

- (void)viewWillLayoutSubviews
{
    int requiredHeight = 55;
    CGRect tabFrame = self.tabBar.frame;
    if (tabFrame.size.height < requiredHeight)
    {
        tabFrame.size.height = requiredHeight;
        tabFrame.origin.y = self.view.frame.size.height - requiredHeight;
        self.tabBar.frame = tabFrame;
    }
}

참고 URL : https://stackoverflow.com/questions/23044218/change-uitabbar-height

반응형