1. 程式人生 > >iOS 獲得iPhone iPad TabbarItem Frame 深度解析

iOS 獲得iPhone iPad TabbarItem Frame 深度解析

- (void)viewDidLoad {
    [super viewDidLoad];
    //iPhone上最多顯示5個tabbarItem ipad上最多顯示8個tabbarItem 高度固定為48
    //iPhone 上item不論幾個(不少以2個)總是均勻分佈的 item的實際寬度(因部分螢幕寬度除不盡count,的除外),(WIDTH - items.count * 2 * 2) / items.count
    //iPad上 item為8個時,是均勻分佈,少於8個時,以螢幕為中心,Item寬度固定76,Item間距固定34,向螢幕兩邊延展。
   CGRect itemFrame = [self getTabBarItemFrameWithCount:self.tabBarController.tabBar.items.count index:2];
    
//    NSLog(@"itemFrame x: %f y: %f w: %f h: %f",itemFrame.origin.x,itemFrame.origin.y,itemFrame.size.width,itemFrame.size.height);
//    NSLog(@"均分 WIDTH %f,",WIDTH);
//    NSLog(@"均分 WIDTH %@,",self.tabBarController.tabBar);
//    NSLog(@"均分 all %f,",itemFrame.size.width * self.tabBarController.tabBar.items.count);
//    if (fabsf((itemFrame.size.width - ((WIDTH - self.tabBarController.tabBar.items.count * 2 * 2) / self.tabBarController.tabBar.items.count))) <= 1) {
//        NSLog(@"均分");
//    }
    UIView *view = [[UIView alloc] initWithFrame:itemFrame];
    view.backgroundColor = [UIColor purpleColor];
    view.alpha = 0.4;
    [self.tabBarController.tabBar addSubview:view];
    //測試彈窗
//    [self alertControllerTest];
}

#pragma mark-
#pragma mark- 獲得tabbarItem的frame
//return CGRectZero 則獲取失敗
- (CGRect)getTabBarItemFrameWithCount:(NSInteger)count index:(NSInteger)index
{
    NSInteger i = 0;
    CGRect itemFrame = CGRectZero;
    for (UIView *view in self.tabBarController.tabBar.subviews) {
        if (![NSStringFromClass([view class]) isEqualToString:@"UITabBarButton"]) {
            continue;
        }
        //找到指定的tabBarItem
        if (index == i++) {
            itemFrame = view.frame;
            break;
        }
    }
    
    return itemFrame;
}


這個方法竟然遇到了奇葩問題,列印tabbar的subviews

<__NSArrayM 0x17465e060>(
<_UIBarBackground: 0x101c128e0; frame = (0 0; 375 49); userInteractionEnabled = NO; layer = <CALayer: 0x174026b40>>,
<UITabBarButton: 0x101a9f5e0; frame = (77 1; 71 48); opaque = NO; layer = <CALayer: 0x174236140>>,
<UITabBarButton: 0x101aa2f10; frame = (152 1; 71 48); opaque = NO; layer = <CALayer: 0x1742365c0>>,
<UITabBarButton: 0x101c8a3e0; frame = (227 1; 71 48); opaque = NO; layer = <CALayer: 0x17042fac0>>,
<UITabBarButton: 0x101aa77c0; frame = (302 1; 71 48); opaque = NO; layer = <CALayer: 0x17042eea0>>,
<UITabBarButton: 0x101abfcd0; frame = (2 1; 71 48); opaque = NO; layer = <CALayer: 0x170436dc0>>
)
+ (CGRect)getTabBarItemFrameWithTabBar:(UITabBar *)tabBar index:(NSInteger)index
{
    //遍歷出tabBarItems
    NSMutableArray *tabBarItems = [NSMutableArray array];
    for (UIView *view in tabBar.subviews) {
        if ([NSStringFromClass([view class]) isEqualToString:@"UITabBarButton"]) {
            [tabBarItems addObject:view];
        }
    }
    //根據frame的X從小到大對tabBarItems進行排序
    NSArray *sortedTabBarItems= [tabBarItems sortedArrayUsingComparator:^NSComparisonResult(UIView *view1, UIView *view2){
        return [@(view1.frame.origin.x) compare:@(view2.frame.origin.x)];
    }];
    //找到指定的tabBarItem 並優化其相對於螢幕的位置
    NSInteger i = 0;
    CGRect itemFrame = CGRectZero;
    for (UIView *view in sortedTabBarItems) {
        if (index == i) {
            itemFrame = view.frame;
            itemFrame.origin.y = ScreenHeight - itemFrame.size.height;
            break;
        }
        i++;
    }
    
    return itemFrame;
}

//+ (CGRect)getTabBarItemFrameWithTabBar:(UITabBar *)tabBar
//                                 index:(NSInteger)index
//{
//    NSLog(@"tabBar.itemSpacing   %f  %f",tabBar.itemWidth,tabBar.itemSpacing);
//    CGFloat tabBarShowWidth = tabBar.items.count * tabBar.itemWidth + (tabBar.items.count - 1) * tabBar.itemSpacing;
//    CGFloat tabBarShowX = (tabBar.frame.size.width - tabBarShowWidth) * 0.5;
//    CGFloat itemX = tabBarShowX + (index - 1) * (tabBar.itemWidth + tabBar.itemSpacing);
//    CGRect itemFrame = CGRectMake(itemX, ScreenHeight - tabBar.frame.size.height, tabBar.itemWidth, tabBar.frame.size.height);
//
//    return itemFrame;
//}

先發一段,後續整理


相關推薦

iOS 獲得iPhone iPad TabbarItem Frame 深度解析

- (void)viewDidLoad { [super viewDidLoad]; //iPhone上最多顯示5個tabbarItem ipad上最多顯示8個tabbarItem 高度固定為48 //iPhone 上item不論幾個(不少以2個)總

iosiphone/ipad)重新彈出“推送申請對話方塊”

ios開發app的時候有時候需要重新彈出“推送申請對話方塊”,而這個對話方塊只是第一次執行時彈出,以後便不會彈出了。 兩種方法: 一、 刪除app,等待24小時後重新安裝app 二、 分以下幾個步驟: 1). 刪除app 2). 將iphone/ipad關機重啟 3). 進

IOS const static extern 深度解析

我想對於ios開發的人來講這3個關鍵字一定都很熟悉,但是你真的都明白了嗎?下面模擬一下面試。我們一層層的深入分析。 1.請你說一下const和巨集的區別 首先,很多字串我們都定義成巨集,但是蘋果推薦的是使用const。 區別: 1.編譯時刻:const是編譯階段,define是預編譯

iPhone/iOS獲得基站資訊[整理]

//CoreTelephony.m#import "CoreTelephony.h"#include <dlfcn.h>#import <UIKit/UIKit.h>#include <stdio.h>#include <stdlib.h> CFMachPor

Javascript 判斷移動裝置,以及iPhone, iPad手機 ios 板本 « 關於網路那些事...

推薦的方式 判斷移動裝置或版本的最佳方式,還是建議使用完整的 Library 若你需要一個快速可以套用在現成專案的作法,則可以參考下方: 判斷移動裝置 雖然這個

iOS遠端真機之iTunes與iPhone的通訊協議usbmuxd解析

       最開始研究與iPhone通訊, 都會想當然的google下usb協議, 必經iphone是通過usb線連線到電腦. 其實不然, iTunes是通過TCP協議與iPhone通訊的 usbmuxd        iTunes使用一種叫”usbmux

劉偉Derick-IOS應用開發(iPhone iPad 應用、遊戲)瀟灑的程式設計師

儲存圖片到photo library與儲存video到photo library的API差不多,但也有所不同。圖片是可以直接把資料寫入photo library,而video需要先把資料存到臨時檔案然後,然後通過臨時檔案的路徑去轉存到photo library。我們直接來看相

iOS開發之獲取iPhone/iPad/Android 介面和icon尺寸規範

注意:iOS所有圖示的圓角效果由系統生成,給到的圖示本身不能是圓角的。1. 桌面圖示 (app icon)for iPhone6 plus(@3x) : 180 x 180for iPhone 6/5s

iOS. iphone/iPad中的尺寸、安全區,導航高度、機型判斷

參考:http://www.25xt.com/appsize iphone:=========== *************APP圖示:20px,29px,40px,60px/(@2x,@3x) tablviewcell的預設高度------44p'x; s

IOS】關於ipadiPhone尺寸的解析度

文章結合至 http://blog.csdn.net/djxiaoyu_haha/article/details/41009575                     http://news.zo

深度解析PHP數組函數array_combine

影響 參數數組 clas () 我們 出現 發現 一點 函數 前些天寫了一篇關於array_merge的函數解析。 今天來看一個新的函數array_combine() 此函數一共有兩個參數,一個是合並後數組的鍵名,另一個為鍵值。 註意:合並後數組的鍵名放在第一個參數位上,鍵

深度解析PHP數組函數array_chunk

數組 三個參數 ret http print 是否 div 解析 logs array_chunk是PHP中的一個數組分割函數,是將一個數組分割為多個數組塊 我們可以把它理解賣豆腐的商人把一整塊大豆腐切割為一個一個的小塊來進行售賣 這個函數需要三個參數:   被切割的數組(

深度解析線程工作原理

路徑 cep dead test deadlock end priority interrupt prior   1, 線程的概念     一個程序中的方法有幾條執行路徑, 就有幾個線程   2, 線程的創建     兩種方式:       1, 繼承Thread

iOS開發中的NSDateFormatter日期格式解析總結

星期四 class con 數字 september february 月份 mil ios開發 在工作中,常常遇到將時間解析出來轉換成自己相應要求的時間格式,之前也有收集相應的轉換格式,如今將自己收集的一部分了做個分享,應該比較完好了,歡迎大家繼續補充 年 y

免費視頻教程:java經典面試題深度解析

免費視頻教程:java經典面試題深度解析 對於很多初學者來說,學好java在後期面試的階段都沒什麽經驗,為了讓大家更好的了解面試相關知識,今天在這裏給大家分享了一個java經典面試題深度解析的免費視頻教程,需要的朋友可以看看,作為參考! 課程簡介:精選多年來名企在各地的Jav

java經典面試題深度解析免費視頻教程分享

java經典面試題深度解析免費視頻教程分享 對於很多初學者來說,學好java在後期面試的階段都沒什麽經驗,為了讓大家更好的了解面試相關知識,今天在這裏給大家分享了一個java經典面試題深度解析的免費視頻教程,需要的朋友可以看看,作為參考! 課程簡介:精選多年來名企在各地的Java

Cortex-M3啟動深度解析

cortex-m3 進入 系統 參數 全局 變量大小 編譯 直觀 clas Cortex-Mx啟動,備忘,以免將來忘記。中斷向量表不用說,從重置中斷開始吧 LDR R0, =SystemInit BLX R0 LDR R0, =__m

Spring源碼深度解析(一)

聯盟 容器 代碼 beans 管理 servle text spring框架 講解   Spring整體架構分為以下幾部分:     1.Core模塊:包含Spring框架的基本核心工具類,Spring其它組件都要使用到這個包中的類,Core模塊是其它組件的基本核心。   

深度解析用例設計方法

內容 登錄名 很好 方法 登錄 腳本 統一 共享 讀取數據並計算 下面是用例設計後出現的較為常見的問題: 從此幾乎很少被執行 執行用例發現的bug很少 根本沒有時間為新的功能需求增補用例 有時間補充,但用例結構越來越亂 特性的用例與通性用例之間聯系不

iOS UIPrintInteractionController在iPad的 iOS10 和 11上的奇怪bug

pop 沒有 wid 方向 .com 即使 nbsp log 研究 今天在彈出UIPrintInteractionController的時候,在ios10 和11的ipad 上測試,發現一直是protrait 方向彈出,結果就出現如下圖的bug: 研究了好長時間,發現是沒