deleted-mezhevikin
@deleted-mezhevikin

Проблема с кастомным TabBarController в ios7 [видеовопрос]?

Использую кастомный таббар — AKTabBarController

В ios 7 наблюдается бага, если перейти в котроллер с скрытым таббаром и вернуться назад, то невозможно проскроллить таблицу до конца.


Высота contentView расчитывается в AKTabBarView.m и расчитывается правильно.


C чем может быть связана подобная бага в ios7?

- (void)layoutSubviews
{
    [super layoutSubviews];
    _tabBar.frame = (CGRect) {
        .origin.x = _tabBar.frame.origin.x,
        .origin.y = (self.tabBarPosition == AKTabBarPositionTop) ? 0.0
                                                                 : CGRectGetHeight(self.bounds) - CGRectGetHeight(_tabBar.bounds),
        .size = _tabBar.frame.size
    };

    _contentView.frame = (CGRect) {
        .origin.x = 0,
        .origin.y = (self.tabBarPosition == AKTabBarPositionTop) ? CGRectGetMaxY(_tabBar.frame) : 0,
        .size.width = CGRectGetWidth(self.bounds),
        .size.height = CGRectGetHeight(self.bounds) - ((!_isTabBarHidding) ? CGRectGetHeight(_tabBar.bounds) : 0)
    };
    NSLog(@"%f", _contentView.frame.size.height);
}





p.s. issue на гитхабе создал 2 недели назад, разработчик так и не ответил
  • Вопрос задан
  • 3345 просмотров
Решения вопроса 1
Flanker_4
@Flanker_4
А можно посмотреть исходники этого проекта?
У Вас после перехода на след. экран высота frame'а таблицы увеличивается на высоту tapBar'a. Такое чувство что при обратной анимации эта высота не сбрасывается, и так и остается большей на высоту tapBar'a.
Таблица, это же _contentView?
если так, то посмотрите чему равно
_isTabBarHidding
при выполнении обратной анимации в строке
.size.height = CGRectGetHeight(self.bounds) — ((!_isTabBarHidding)? CGRectGetHeight(_tabBar.bounds): 0)
есть предположение, что _isTabBarHidding == YES (хотя должно быть NO).
Если так, то скорей всего layoutSubview вызывается раньше, чем Вы обновляете _isTabBarHidding, и Вам нужно принудительно послать базовой вьюхе setNeedsLayout, после установки _isTabBarHidding == NO
Но повторюсь, без исходников
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
gooddy
@gooddy


diff --git a/AKTabBarController/AKTabBarController.m b/AKTabBarController/AKTabBarController.m
index e8226ac..9853490 100755
--- a/AKTabBarController/AKTabBarController.m
+++ b/AKTabBarController/AKTabBarController.m
@@ -251,6 +251,9 @@ typedef enum {
     tabBar.hidden = NO;
     tabBar.transform = CGAffineTransformMakeTranslation(CGRectGetWidth(self.view.bounds) * directionVector, 0);
     // when the tabbarview is resized we can see the view behind
+	CGRect tmpTabBarView = tabBarView.contentView.frame;
+	tmpTabBarView.size.height = CGRectGetHeight(tabBarView.bounds) - CGRectGetHeight(tabBar.bounds);
+	tabBarView.contentView.frame = tmpTabBarView;
     
     [UIView animateWithDuration:((animated) ? kPushAnimationDuration : 0) animations:^{
         tabBar.transform = CGAffineTransformIdentity;

сохраняете в файлик fix.patch, заходите в репу компонента и

git apply /path/to/fix.patch

ну или руками добавить

Ответ написан
@gleb_kudr
Проблема связана с изменением положения контента относительно экрана в ios7. Раньше контент был под навигейшеном и над таббаром, а нижний и верхний оффсеты =0 (величина, на сколько верхнее и нижнее значение скролла отступает от границы контрола). В ios7 контент совпадает с размерами экрана, а оффсеты не равны нулю и определяются по хитрому и кривому механизму, который худо-бедно работает на нативных контролах, а с кастомными приходится их выставлять руками. В общем, гуглите «ios7 uitableview offset».
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы