Открыть список
Как стать автором
Обновить

Комментарии 10

Не будет ли выстрелом в ногу создание новых layer-ов при каждом вызове метода draw?
Уточните, пожалуйста, опасение связано с утечкой памяти? Если да, то никаких проблем не будет, потому что слои создаются локально в методе drawTabBar() и перестают существовать после выхода из метода. А свойства класса опциональные, поэтому утечки тоже быть не может.
Покажу примером
class View: UIView {
  var layers: [CALayer] = []

  func draw() {
    layers.append(CALayer())
    layers.append(CALayer())
  }

  func viewDidLoad() {
    // ...
    draw()
    draw()
   // сколько будет элементов в layers?
  }


сколько будет элементов в конце вызова viewDidLoad?
Добрый день. В вашем случае в layers будет 4 элемента. В нашем случае мы всегда проверяем наличие слоев: если слой уже есть, он заменяется, а не добавляется, поэтому у нас их всегда остается 2
согласен, не заметил проверку

Но в проверке есть ошибка, если уже есть 2 слоя, то отработает только первый if, а остальные проигнорятся

Нужно для каждого слоя свой if сделать

Ну и если по хорошему, то нужно делать проверку, на существование слоев, в самом начале, чтоб не делать лишнюю работу, ведь по сути слои не меняются.
Спасибо, проверку действительно стоит делать отдельно для каждого слоя, при этом она находится в правильном месте, так как на момент проверки обновленный слой уже должен быть создан
Я имел ввиду лишние вызовы инициализаторов, время исполнения которых ненулевое. А это значит, что вопрос падения — это вопрос количества вызовов. К примеру, если в инициализаторе layer-а будет какое-то потенциально весомое вычисление, то при многократном вызове draw (например анимация) эти вычисления будут прогоняться зря. Конечно, в реальном примере это не поднимет использование cpu даже на процент, но все-же не думаю что хорошая практика — создавать объект на всякий случай и надеяться на оптимизацию)
А зачем такие сложности с UIResponderChain, если можно просто добавить экшен для кнопки?
Если нажать на круглую кнопку чуть выше границы таб-бара, ничего не произойдет (а мы хотим, чтобы был выбран соответствующий tabBarItem и поменялся ViewController)

Можно, конечно, ограничиться добавлением экшена для кнопки, но тогда не будет обрабатываться касание на выступающей вверх области кнопки.

Мы добавили в статью ссылку на проект на GitHub. Можно закомментировать переопределенный метод point(inside:with:) в классе CustomTabBar и проверить, как это будет работать без UIResponderChain
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.