Как я могу получить ширину UITabBarItem? - PullRequest
16 голосов
/ 04 апреля 2011

Ширина UITabBarItem варьируется в зависимости от того, сколько их.

Как определить ширину элементов панели вкладок?

По возможности я ищу свойство, а не математическую формулу, поскольку наiPad, также есть проблема заполнения по обе стороны от панели вкладок.Рассмотрим эти скриншоты.Обратите внимание на отступы с обеих сторон элементов панели вкладок на iPad (выделены красными прямоугольниками).Это дополнение не существует на iPhone.

iPad:

enter image description here

iPhone: enter image description here

Ответы [ 7 ]

7 голосов
/ 04 апреля 2011

Редактировать : в комментариях ниже было отмечено, что это решение не работает в бета-версии iOS 5, поэтому будьте готовы изменить его в соответствии с вашими потребностями.

Я думаю, что для того, чтобы сделать это правильно, вы должны быть в состоянии добраться до фрейма каждого элемента панели вкладок.К счастью, это возможно:

CGFloat tabBarTop = [[[self tabBarController] tabBar] frame].origin.y;
NSInteger index = [[self tabBarController] selectedIndex];
CGFloat tabMiddle = CGRectGetMidX([[[[[self tabBarController] tabBar] subviews] objectAtIndex:index] frame]);

Приведенный выше код дает координату y верхней части панели вкладок и координату x середины выбранного элемента вкладки.Отсюда вы можете добавить свой вид индикатора к виду контроллера панели вкладок относительно этой точки.

Отказ от ответственности : опасность при таком подходе заключается в том, что он заглядывает под капот UITabBar class, получая доступ к его иерархии представления и свойству frame экземпляров частного UITabBarButton класса.Возможно (однако маловероятно), что этот подход может быть затронут / сломан будущим обновлением iOS.Однако у вас нет доступа к каким-либо частным API-интерфейсам, поэтому ваше приложение не должно быть отклонено из App Store.

Я сделал простой проект iPad, демонстрирующий, как он работает , в комплектеанимации.

1 голос
/ 20 июля 2017

Свифт 3

Я создал общий экземпляр в UIApplication, затем вытащил ширину моего подпредставления

tabBarController?.tabBar.subviews[1].frame.width

0 голосов
/ 30 ноября 2016

Вы можете получить представление tabBarItem с помощью частного свойства view.Тогда просто получите представление frame.

- (CGRect)rectForTabBarItem:(UITabBarItem *)tabBarItem {
    UIView *itemView = [tabBarItem valueForKey:@"view"];
    return itemView.frame;
} 
0 голосов
/ 29 апреля 2015

Глядя на ответ выше:

  1. Элементы в UITabBar работают по-разному в iPhone и iPad. В iPhone они занимают всю ширину, в iPad - по горизонтали.
  2. Между элементами в iPad есть промежуток.
  3. Вы можете установить значения ширины и интервала, используя tabBar.itemWidth или tabBar.itemSpacing. Вы не можете прочитать системный интервал или ширину из него - вы получите 0, если не установите его.

Итак, вот мой пример, как получить кадры всех UITabBarItems:

// get all UITabBarButton views
    NSMutableArray *tabViews = [NSMutableArray new];
    for (UIView *view in self.tabBar.subviews) {
        if ([view isKindOfClass:[UIControl class]]) {
            [tabViews addObject:[NSValue valueWithCGRect:view.frame]];
        }
    }

    // sort them from left to right
    NSArray *sortedArray = [tabViews sortedArrayUsingComparator:^NSComparisonResult(NSValue *firstValue, NSValue *secondValue) {
        CGRect firstRect = [firstValue CGRectValue];
        CGRect secondRect = [secondValue CGRectValue];

        return CGRectGetMinX(firstRect) > CGRectGetMinX(secondRect);
    }];

Теперь у вас есть таблица фреймов, соответствующая вашим элементам панели вкладок. Вы можете, например, поместите изображение в выбранную рамку индексной кнопки.

    CGRect frame = self.tabBar.bounds;
    CGSize imageSize = CGSizeMake(CGRectGetWidth(frame) / self.tabBar.items.count, self.imageView.image.size.height);
    CGRect selectedRect = sortedArray.count > self.selectedIndex ? [sortedArray[self.selectedIndex] CGRectValue] : CGRectZero;
    [self.imageView setFrame:CGRectIntegral(CGRectMake(CGRectGetMinX(selectedRect), CGRectGetMaxY(frame) - imageSize.height,
                                                       CGRectGetWidth(selectedRect), imageSize.height))];
0 голосов
/ 17 марта 2015

Я попробовал эти 2 свойства UITabBar:

@property(nonatomic) CGFloat itemWidth NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR;
@property(nonatomic) CGFloat itemSpacing NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR;

Но получите нулевое значение, как сказал Вив. Поэтому я написал несколько кодов, чтобы получить правильную ширину:

    CGFloat tabBarItemWidth = 0;
    for (UIView *view in [self.tabBarController.tabBar subviews]) {
        if ([view isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
            if (tabBarItemWidth == 0) {
                tabBarItemWidth = view.frame.origin.x;
            } else {
                tabBarItemWidth = view.frame.origin.x - tabBarItemWidth;
                break;
            }
        }
    }

Почему бы не использовать ширину первого UITabBarButton? Потому что между кнопками панели вкладок есть пробелы. :)

0 голосов
/ 20 июня 2014

Переберите подпредставления вашего tabBar и найдите представления с классом "UITabBarButton". Это представления для каждого элемента вкладки.

for (UIView *view in self.tabBar.subviews) {
    if ([view isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
        // view.frame contains the frame for each item's view
        // view.center contains the center of each item's view
    }
}
0 голосов
/ 04 апреля 2011

UITabBarItem наследуется от UIBarItem, который наследуется от NSObject. Поскольку он не наследуется от UIView, я не знаю, что вы сможете получить нужную информацию только с помощью свойства. Я знаю, что вам не нужен математический способ сделать это, но может показаться, что получение рамки панели вкладок и деление на число # вкладок было бы разумным вариантом, который должен работать независимо от оборудования (iphone vs ipad) , Обивка не должна влиять на это, верно? Итак, у вас будет:

tabSize = tabbar.frame.size.width / [tabbar.items count];
tabBarStart = tabbar.frame.origin.x;

// Assume index of tabs starts at 0, then the tab in your pic would be tab 4
//   targetX would be the center point of the target tab.
targetX = tabBarStart + (tabSize * targetTabIndex) + (tabSize / 2);

Мне также интересно узнать, найдет ли кто-нибудь простое свойство для предоставления этой информации.

...