1. Objective C / Говнокод #17844

    −406

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    Код конца 2014 года
    
        CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;
        if (iOSDeviceScreenSize.height == 480)
            isRetina = true;
        else
            isRetina = false;5

    Запостил: Headless, 23 Марта 2015

    Комментарии (40) RSS

    • Это позор и смерть для народа того, кто писал это
      Ответить
    • А что значит цифра после точки с запятой?
      Ответить
      • Видимо случайно добавил, цифры там конечно нет. Жалко нельзя редактировать.
        Ответить
        • Жаль, я думал, фишки новые. Типа выровнять команду по адресу, кратному 5.
          Ответить
          • присвоить 5 раз, что уж наверняка
            Ответить
            • я ловил забавные баги в clang/llvm: компилятор просто пропускал некоторые выражения. Причем ловил и в крестах и на objc.
              Так что хотелось бы иметь такую инструкцию :)
              Ответить
      • Встроенный юнит-тест, проверяющий длину false
        Ответить
    • Я вот замечаю, что многие до сих пор не могут(или не хотят) в autolayout, хотя ему уже точно пару лет есть
      Ответить
    • когда-то айфонов было 2 - ретина и неретина. Так что вполне себе нормальный код из старого проекта, который поддерживал только ифоны и не поддерживал смену ориентации
      Ответить
      • >>Так что вполне себе нормальный код

        Для говнокодера - да. Нормальные люди пишут код, который годен больше месяца
        Ответить
        • чел, я не спорю, что это плохохо для 2014 года, но код работает на ВСЕХ ios кроме 8, причем без дополнительных проверок. Напиши вариант лучше. Точнее работал бы, если б автор поста не допустил ошибку.
          Расскажешь почему именно ios 8?
          Ответить
          • Там написана дата написания кода) Конец 2014 - тогда уже были шестые айфоны.

            Кроме того, проверка изначально не верна, height = 480 был равен и на айфоне 3gs, и 3g, которые не имели ретина экранов.

            Также на UIScreen есть проперти scale, в котором будет 2.0 или 3.0, если девайс ретина.

            Ну а помимо всех перечисленных пунктов могу добавить, что этот код я встретил в десятке контроллеров этого легаси проекта.
            Ответить
            • так вот в этом и есть ошибка, причем скорее всего твоя, потому что height = 480 - это неретина, причем работало бы во всех ios и даже на ios 8 при определенных условиях

              Scale? Ок, открываем документацию и читаем когда он появился. А после этого читаем когда появился bounds.

              И дата 2014 кстати ни о чем не говорит. Ты лучше напиши, какую минимальную версию ios должно поддерживать приложение и iphone или ipad тоже?
              Ответить
              • Да что ты говоришь))) height 480 и на айфоне 3gs и на айфоне 4/4c.

                Scale - iOS 4.0. Deployment target проекта - iOS 7. iPhone only.
                Ответить
                • ну так вот с этого и надо было начинать - про ios 7
                  Ответить
                  • А тут нечего проверять - мы всегда работаем с поинтами а не с пикселями. О чем неоднократно написано в документации.
                    Ответить
                    • да, наверное ты прав. А scale у тебя в ios 8 нормально работает? Не доходили руки проверить
                      Ответить
                      • Честно говоря никогда не юзал - не вижу смысла, когда есть автолейаут. Кроме того, с iOS 7 iPhone не ретина не осталось, так что 1x мы фактически дропнули, и даже не добавляем в ассеты.

                        Если приложение запускается на айпаде мини(единственный не ретина девайс, оставшийся в природе), то 2x ассеты просто даунскейлятся.
                        Ответить
                        • lol, а ipad 2? А accessibility?
                          Ответить
                          • iPad 2 идентичен айпаду мини - разрешение одинаковое. А что с accessibility?
                            Ответить
                            • ну например это:
                              http://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions
                              Ответить
                              • И что?
                                Ответить
                                • вместо 5 экранов (или сколько их там) получили на выходе 15 - больше чем устройств? Да не, ничего не произошло
                                  Ответить
                                  • Я не понимаю, о чем ты говоришь. С автолейаутом мы можем поддерживать все разрешения, и не интересоваться вопросом ретина они или нет. Вопрос намного важнее - это ширина и высота экрана. Сейчас фактически нужно поддерживать 4 размера экрана айфонов, и один размер айпада.

                                    Айфоны - 320 x 480, 320 x 568, 375x667, 414x736
                                    Айпад - 1024 x 768.

                                    Все в пойнтах.
                                    Ответить
                              • По сравнению с зоопарком андроидов - фигня. У вас на iOS их хотя бы конечное число (всего 15?)...
                                Ответить
                                • на андроид просто к этому вопросу умнее подошли (хотя бы для приложений со стандартным UI) - на манер разметки html.
                                  А тут - сначала одно разрешение будет всегда, потом вот вам еще одно недоразрешение (ретина, которая улучшает четкость, но не изменяет физически размеры). Вам это слишком просто? А нате вам еще "ретина плюс один сантиметр". Что и этого мало? Нате вам еще ипадов и ифонов.
                                  И из-за этой неопределенности имеем over9000 способов выделить нужное разрешение (и поведение в зависимости от него) - начиная с bounds и определения разрешения по модели и заканчивая autolayout и size classes. И все эти способы ущербны. Даже если рассматривать только последние технологии - storyboard и так уже перегружен элементами, а с size classes вообще превращается в ад
                                  Ответить
                                  • В эппл просто не умеют программировать. У них все продукты - гламурное говно.
                                    Ответить
    • сколько обсирают этот код - а до сих пор не нашли ошибку в посте

      плюсану тому, кто найдет
      Ответить
      • ты про false;5 ?
        Ответить
      • CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;
        isRetina = iOSDeviceScreenSize.height == 480;

        или вообще:
        isRetina = [[UIScreen mainScreen] bounds].size.height == 480;
        Ответить
        • Это ошибка?
          Ответить
        • Ок, скажу. Ошибка в том, что даже если бы size выдавал информацию о количестве пикселей, а не точек, то размер 480 - у НЕретина экранов. А вы пишете наоборот
          А поскольку выдает информацию в точках, то все равно придется проверять что-то еще, потому что повторяя высказавшегося выше - у 4/4s тоже размер 480
          Ответить
          • >о количестве пикселей, а не точек
            А это не одно и то же?
            Ответить
            • Нет. Пиксели (px) - физические пиксели экрана. Поинты (pt) - 1/72 дюйма.
              Ответить
        • > [[UIScreen mainScreen] bounds].size.height == 480;
          А если айфун набок повёрнут?
          Ответить

    Добавить комментарий