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

    −108

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    - (void) fixUIAfterRotation: (UIInterfaceOrientation) interfaceOrientation
    {
    	[self.view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:UIInterfaceOrientationIsPortrait(interfaceOrientation)? @"bg_new.png":@"bg_new_90.png"]]];
      	NSString *path = [[NSBundle mainBundle] bundlePath];
    	NSURL *baseURL = [NSURL fileURLWithPath:path];
    	NSString *htmlStr;
    	webError = NO;
        orient = UIInterfaceOrientationIsPortrait(interfaceOrientation)? 1:2;
        float width_ = [[UIScreen mainScreen] bounds].size.height;
        viewNews.frame = isRotation? (UIInterfaceOrientationIsPortrait(interfaceOrientation)? 
               CGRectMake(0, 0, width_, 240):CGRectMake(0, 0, width_, width_ - 90)):(UIInterfaceOrientationIsPortrait(interfaceOrientation)? CGRectMake(0, 0, 320, width_ - 81):CGRectMake(0, 0, width_, 240));
        isRotation = isRotation? NO:isRotation;
        
    #if defined(PRO_PROJECT)    
     	if (UIInterfaceOrientationIsPortrait(interfaceOrientation))
    	{
    		htmlStr = [NSString stringWithFormat:@"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" 
                              \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\">
                               <head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><title>Untitled Document</title>
                               <style>body {margin:0px; padding:0px; font:13px arial; background:none;}
                               a {text-decoration:underline; color:#fbcf04; font-weight:bold; !important;} a:hover {text-decoration:none;}
                               .title{background:#575757 left top repeat-x; font:bold 15px Arial; color:#FFF; padding:14px 30px 0px 0px; height:31px; 
                               border-bottom:1px solid #000000; line-height:14px}.titleIm{background:#575757 left top repeat-x; padding:13px 8px 13px 13px; height:31px; 
                               border-bottom:1px solid #000000;}.news_body {border-top:1px solid #414141; padding:10px 14px 14px 14px; 
                               color:#FFF; line-height:19px; background:#3d3d3d;}.news_body p {padding-top:0px;}</style></head>
                              <body><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"320\" height=\"388\"><tr><td width=\"75\" valign=\"top\" class=\"titleIm\">
                              <img src=%@ height=\"70\" width=\"70\"></td><td valign=\"top\" class=\"title\">%@ 
                              <div style=\"font:11px Arial; color:#858585; line-height:18px;\">%@</div></td></tr><tr>
                              <td colspan=\"2\" valign=\"top\" class=\"news_body\">%@</td></tr></table></body></html>",
                               imageName, [newsDescription objectForKey:@"titleNews"], 
                               [CORENewsTitleList getDataString:[newsDescription objectForKey:@"dateNews"]], 
                               [newsDescription objectForKey:@"discriptionNews"]];
    	}
    	else
    	{
    		htmlStr = [NSString stringWithFormat:@"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" 
                              \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\">
                             <head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><title>Untitled Document</title>
                             <style>body {margin:0px; padding:0px; font:13px arial; background:none;}
                             a {text-decoration:underline; color:#fbcf04; font-weight:bold; !important;}a:hover {text-decoration:none;}
                             .title {background:#575757 left top repeat-x; font:bold 15px Arial; color:#FFF; padding:14px 30px 0px 0px; height:31px; 
                              border-bottom:1px solid #000000; line-height:14px}.titleIm {background:#575757 left top repeat-x; padding:13px 8px 13px 13px; height:31px; 
                              border-bottom:1px solid #000000;}.news_body {border-top:1px solid #414141; padding:10px 14px 14px 14px; 
                              color:#FFF; line-height:19px; background:#3d3d3d;}.news_body p {padding-top:0px;}</style></head>
                              <body><table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"%f\" height=\"240\"><tr><td width=\"75\" valign=\"top\" class=\"titleIm\">
                              <img src=%@ height=\"70\" width=\"70\"></td><td valign=\"top\" class=\"title\">%@ 
                              <div style=\"font:11px Arial; color:#858585; line-height:18px;\">%@</div></td></tr><tr>
                              <td colspan=\"2\" valign=\"top\" class=\"news_body\">%@</td></tr></table></body></html>",
                              width_, imageName, [newsDescription objectForKey:@"titleNews"], 
                              [CORENewsTitleList getDataString:[newsDescription objectForKey:@"dateNews"]], 
                              [newsDescription objectForKey:@"discriptionNews"]];
    	}
    #else
        if (UIInterfaceOrientationIsPortrait(interfaceOrientation))
    	{
                    // тот же упоротый код, что и выше, за исключением цветов для бэкграунда и надписей.
            }
    	else
    	{
                    // тот же упоротый код, что и выше, за исключением цветов для бэкграунда и надписей.
    	}
    #endif
    	[viewNews loadHTMLString:htmlStr baseURL:baseURL];
    }

    Поворачиваем вебвью во вью-контроллере, который может использоваться в 2 проектах, имеющих различные темы (отличается бэкграунд и цвет надписей).

    Запостил: QuickNick, 30 Мая 2013

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

    • CHTML
      Ответить
    • каждый раз, когда я смотрю на ObjC код, я вспоминаю о проблемах голодных африканских детей и канонических полях в 75 символов шириной
      а если серьезно - это пиздец даже для меня
      Ответить
      • Предлагаешь скормить всех ObjC программистов детям?
        Ответить
        • я понимаю и разделяю твои мысли, но не нужно недооценивать африканские рты
          пока они жрут миллион ObjC программистов (а это примерно часа полтора), следующие на очереди - мы
          так что пусть пока побудут буфером безопасности
          Ответить
          • Я хотел бы написать что-нибудь про неиссякаемый источник и PHP, но не буду. ой...
            Ответить
            • наступит момент когда распухшие африканские дети взмолятся "Горшочек, не вари", и суда, везущие закованных в цепи кодеров (как когда-то африканцев в америку) вынуждены будут лечь на обратный курс.
              Ответить
    • [NSString stringWithFormat:@"<!DOCTYPE html PUBLIC \"-//W3C//DTD
      XHTML 1.0 Transitional//EN\"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html
      xmlns=\"http://www.w3.org/1999/xhtml\"> <head><meta
      http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"
      /><title>Untitled Document</title> <style>body {margin:0px;
      padding:0px; font:13px arial; background:none;} a
      {text-decoration:underline; color:#fbcf04; font-weight:bold;
      !important;} a:hover {text-decoration:none;}
      .title{background:#575757 left top repeat-x; font:bold 15px
      Arial; color:#FFF; padding:14px 30px 0px 0px; height:31px;
      border-bottom:1px solid #000000;
      line-height:14px}.titleIm{background:#575757 left top repeat-x;
      padding:13px 8px 13px 13px; height:31px; border-bottom:1px solid
      #000000;}.news_body {border-top:1px solid #414141; padding:10px
      14px 14px 14px; color:#FFF; line-height:19px;
      background:#3d3d3d;}.news_body p
      {padding-top:0px;}</style></head> body><table cellpadding=\"0\"
      cellspacing=\"0\" border=\"0\" width=\"320\"
      height=\"388\"><tr><td width=\"75\" valign=\"top\"
      class=\"titleIm\"> img src=%@ height=\"70\" width=\"70\"></td><td
      valign=\"top\" class=\"title\">%@ div style=\"font:11px Arial;
      color:#858585; line-height:18px;\">%@</div></td></tr><tr> td
      colspan=\"2\" valign=\"top\"
      class=\"news_body\">%@</td></tr></table></body></html>",
      imageName, [newsDescription objectForKey:@"titleNews"],
      [CORENewsTitleList getDataString:[newsDescription
      objectForKey:@"dateNews"]], [newsDescription
      objectForKey:@"discriptionNews"]];
      ?
      Ответить
      • Пиздец. Других слов нет. Это прям Objective PHP какое-то, судя по стилю.

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

        P.S. Или вообще подготовить 4 разных файла и не парить моск.
        Ответить
        • На Андроиде мы сделали Builder, который строил HTML-документ - последовательно прибавляли head, body и т.д.

          Чуть позже выяснил, что это велосипед, и можно было бы попробовать какой-нибудь XmlSerializer (org.xmlpull).
          Ответить
          • Ну вот в этом конкретном случае я бы сделал тупо 4 файла :)
            Ответить
            • А потом, когда этот модуль перекочует еще в 2 приложения?
              Ответить
              • 2 файла в каждом приложении это на самом деле даже удобнее. Какая-никакая независимость. Можно оформление сменить чуть более чем полностью, а не только пару заранее заданных точек. Поэтому я все-таки за отделение лейаутов и скинов от логики, как это и сделано в андроиде.
                Ответить
                • Можно 1 разметку сделать, просто ей параметры ставить из некоторого класса темы. В библиотеке объявить абстрактный класс Theme, а в конечном приложении его реализовать.
                  Ответить
                  • Ну на самом деле все зависит от того, насколько разными планируются скины... Если там например разный брендинг - лучше сделать отдельные файлы. А если отличаются только цвета - ну ок, можно менять параметры через код.
                    Ответить
                  • Я как-то фана ради делал самодельный шаблонизатор на C#. Там буквально 15 строчек, в качестве входных параметров шаблон и набор пар ключ-значение.
                    Ответить
                    • js. оптимальный язык для этого.
                      Тут Роман когда-то постил хороший пример, тоже совсем короткий.
                      Входные параметры - структура документа. Плюс емнип там еще были функции-генераторы.
                      Ответить
                      • вот
                        var tmpl = {
                                    render : function(spec) {
                                        var elem = document.createElement(spec[0]);
                                        if (spec.length == 1) {
                                            return elem;
                                        }
                                        var maybeAttrs = spec[1];
                                        var n = 2;
                                        if (this._isHash(maybeAttrs)) {
                                            this._applyAttrs(elem, maybeAttrs);
                                        } else {
                                            n = 1;
                                        }
                                        while (n < spec.length) {
                                            this._makeElem(elem, spec[n++]);
                                        }
                                        return elem;
                                    },
                                    _applyAttrs : function(e, attrs) {
                                        for (attr in attrs) {
                                            if (attrs.hasOwnProperty(attr)) {
                                                e.setAttribute(attr, attrs[attr]);
                                            }
                                        }
                                    },
                                    _makeElem : function(elem, x) {
                                        var type = typeof (x);
                                        var i = 0;
                                        if (type == "string") {
                                            elem.appendChild(document.createTextNode(x));
                                        } else if (x instanceof Array) {
                                            // flatten array of nested elements
                                            if (x[0] instanceof Array) {
                                                while (i < x.length) {
                                                    this._makeElem(elem, x[i++]);
                                                }
                                            } else {
                                                elem.appendChild(this.render(x));
                                            }
                                        } else if (x instanceof Function) {
                                            this._makeElem(elem, x.apply(null));
                                        }
                                    },
                                    _isHash : function(x) {
                                        return typeof (x) == "object" && !(x instanceof Array);
                                    }
                        }
                        ещё на пхп есть аналог, если интересно.
                        Ответить
                        • Не интересно )
                          Ответить
                        • Можно пример шаблона?
                          Там внутри WebView ещё суровые манипуляции с элементами производятся. Входные данные приходят с сервера в виже html, после чего запихиваются этим кодом в вебвью, подрубаются скрипты и генерируют/обновляют документ внутри WebView по необходимости.
                          Эта часть функционала давно переписана без использования UIWebView (года полтора как), а эта хрень оставалась для iOS 3.1.3. Какого чёрта QuickNick её откопал и что с ней собирается делать - я не знаю, но предчувствия у меня нехорошие.
                          Ответить
                          • http://jsfiddle.net/YeKDX/
                            вот пример.
                            Ответить
                          • Я что-то в том контроллере не обнаружил следов Коретекста.
                            -(void) loadView 
                            {
                            	[super loadView];
                            	countWebView = 0;
                            	if (orient == 0)
                                {
                            		orient = 1;
                                }
                            	viewNews = [[UIWebView alloc] init];
                            	viewNews.backgroundColor = [UIColor clearColor];
                            	viewNews.scalesPageToFit = NO;
                            	viewNews.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
                            	viewNews.autoresizesSubviews = YES;
                            	viewNews.dataDetectorTypes = UIDataDetectorTypeLink;//viewNews.detectsPhoneNumbers = NO;    
                            	viewNews.delegate = self;
                            	[self.view addSubview: viewNews];
                            	[viewNews setOpaque:NO];
                            }
                            Ответить
                            • Какой страницы это контроллер?
                              Ответить
                            • А, тьфу, туплю. Новости. Ну тогда поздравляю, ебитесь )
                              Ответить
                        • на ПХП можно.
                          Ответить
                      • Проблема в том, чтобы отдать данные в webview. События webview нельзя отловить из нативного кода, в этом плане UIWebView очень неудобен. Единственный способ передать данные в события вида onLoad, ready и т.п, кроме записи отдельного файла на диск - это включить данные прямо в документ. Вообще гк - это модификация кода, когда-то написанного мной. Он и так не был красив, но тут вообще. Собственно там данные перелаются в виде JSON, но вот с инициализацией пришлось воротить костыли. Если бы мне сейчас пришлось делать что-то падобное - я бы взял простейший шаблонизатор, поместив шаблон в виде отдельного файла в ресурсы.
                        Ответить
    • Ууууу.... Как мне это знакомо.... Какое чудо было, когда удалось пробить ищменение отрисовки документа на нативное.....
      Ответить
      • Опять сплав моего кода и творчества аффтара... Пиздец, я хочу это развидеть.
        ---
        Хотя, кстати, в html-коде узнаю тут так же почерк нашего бывшего главного программиста...
        Ответить
    • Кстати, вы же пробили версию 4.2?
      Выброси это говно, оно нужно только для <3.2. ВО всех остальных случаях использовался Core Text, который (на момент моего ухода) умел всё тоже самое, что и вебвью.
      Ответить
      • Последние версии Икскода не компилят под версии ниже 4.3.
        Ответить
        • Вы просто плохо пытались )
          А по теме - нафига вам сдалось говно, от которого давно отказались и оставляли только для совместимости со старыми версиями iOS?
          Ответить
          • Так от старого проекта еще не отказались. А за актуальностью кода там не следят - люди озадачены тем, чтобы туда впихнуть порцию свежих фич или нового дизайна, и тем, чтобы это не убилось.
            Ответить
            • Так зачем делать двойную работу? У вас ветка WebView для для отображения того, для чего приложение предназначено никогда не используется.
              Ответить
    • Соберем для Вас по интернет клиентские базы данных для Вашего Бизнеса Узнайте подробнее по Email: [email protected] Тел +79139230330(wiber/whatsapp/telegram) Skype: prodawez390
      Ответить
    • показать все, что скрытоvanished
      Ответить

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