iOS APP全体で灰色のテーマを実現する例示コード


灰色のテーマ
背景
いくつかの哀悼日に、清明節の時には、いくつかのあいまいなテーマ機能を実現します。一部のアプリの需要はtabトップページで灰色のパターンを実現すればいいですが、いくつかの需要は直接に全体のアプリが灰色のモデルになります。
  •  一般UIインタフェース
  • ウェブページ
  • xibインターフェース
  • atributextにロードされたhttml Stringページ
  • atachmentストラップページ
  • 実装
    基本的な実現方式1では、一般ページはhook色方式で2.webページはグレーjs注入で実現する。
    画像が灰色に変わります
    画像を再描画すると灰色のコードになります。
    
    //image  
    - (UIImage *)getGrayImage {
        
      const int RED =1;
      const int GREEN =2;
      const int BLUE =3;
        
      UIImage *image = self;
        
      // Create image rectangle with current image width/height
      CGRect imageRect = CGRectMake(0,0, image.size.width* image.scale, image.size.height* image.scale);
        
      int width = imageRect.size.width;
      int height = imageRect.size.height;
        
      // the pixels will be painted to this array
      uint32_t *pixels = (uint32_t*) malloc(width * height *sizeof(uint32_t));
        
      // clear the pixels so any transparency is preserved
      memset(pixels,0, width * height *sizeof(uint32_t));
        
      CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
        
      // create a context with RGBA pixels
      CGContextRef context = CGBitmapContextCreate(pixels, width, height,8, width *sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast);
        
      // paint the bitmap to our context which will fill in the pixels array
      CGContextDrawImage(context,CGRectMake(0,0, width, height), [image CGImage]);
        
      for(int y = 0; y < height; y++) {
        for(int x = 0; x < width; x++) {
          uint8_t *rgbaPixel = (uint8_t*) &pixels[y * width + x];
            
          // convert to grayscale using recommended method: http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale
          uint32_t gray = 0.3 * rgbaPixel[RED] +0.59 * rgbaPixel[GREEN] +0.11 * rgbaPixel[BLUE];
            
          // set the pixels to gray
          rgbaPixel[RED] = gray;
          rgbaPixel[GREEN] = gray;
          rgbaPixel[BLUE] = gray;
        }
      }
        
      // create a new CGImageRef from our context with the modified pixels
      CGImageRef imageRef = CGBitmapContextCreateImage(context);
        
      // we're done with the context, color space, and pixels
      CGContextRelease(context);
      CGColorSpaceRelease(colorSpace);
      free(pixels);
        
      // make a new UIImage to return
      UIImage *resultUIImage = [UIImage imageWithCGImage:imageRef scale:image.scale orientation:UIImageOrientationUp];
        
      // we're done with image now too
      CGImageRelease(imageRef);
        
      return resultUIImage;
      
    }
    テキストが灰色になります
    テキストtext Colorが灰色rgbに変わる処理はたくさんあります。ここで簡単に一つを提供します。
    
        [self swizzleMethod:self orgSel:@selector(initWithRed:green:blue:alpha:) swizzSel:@selector(hdd_initWithRed:green:blue:alpha:)];
    + (UIColor *)hdd_colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)a{
      CGFloat gray = red*0.299 + green*0.587 + blue*0.114;
      if ([CSDarkSiteManager isLocalCacheDarkSiteStatus]) {
        return [self hdd_colorWithRed:gray green:gray blue:gray alpha:a];
      }
      else {
        return [self hdd_colorWithRed:red green:green blue:blue alpha:a];
      }
    }
    テキストが灰色になっても、システム色の灰色処理に影響を及ぼします。例えば、「Ultwhite Color」、システムalertViewのボックスの中の青いボタンの色処理には、専用の処理方法が必要です。
    xib画像が灰色になります
    xibで画像を読み込むのは「UImageView image Name:@」ではないので、直接にHOME setImageでxib画像を灰色に設定することはできません。
    方法:UImageViewのawake FroomNibを書き直して、またhook setImageの方法を実行してロードします。
    webViewのは灰になります
    chook webViewの初期化方法は、js灰色を注入します。
    
    + (void)swizzHook {
      static dispatch_once_t onceToken;
      dispatch_once(&onceToken, ^{
        Method originalMethod = class_getInstanceMethod([self class], @selector(initWithFrame:configuration:));
        Method swizzledMethod = class_getInstanceMethod([self class], @selector(lg_initWithFrame:configuration:));
        method_exchangeImplementations(originalMethod, swizzledMethod);
      });
    }
    - (instancetype)lg_initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration {
      Class class = NSClassFromString(@"AIRWKWebView");
      if ([CSDarkSiteManager isLocalCacheDarkSiteStatus] && ![self isKindOfClass:class]) {
        NSString *jScript = @"var filter = '-webkit-filter:grayscale(100%);-moz-filter:grayscale(100%); -ms-filter:grayscale(100%); -o-filter:grayscale(100%) filter:grayscale(100%);';document.getElementsByTagName('html')[0].style.filter = 'grayscale(100%)';";
        //   
        WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
        [configuration.userContentController addUserScript:wkUScript];
        WKWebView *webView = [self lg_initWithFrame:frame configuration:configuration];
        return webView;
      }
      else {
        WKWebView *webView = [self lg_initWithFrame:frame configuration:configuration];
        return webView;
      }
      
    }
    atributeTextでhttml Stringをロードして灰になります。
    atributeの場合はhtmlをロードしますが、設定カラーで直接色を変えるのではなく、対応する属性を巡回して色を再割り当てする必要があります。
    存在する問題
    このように全体的に変更すると、キーボードの色が変わってしまうかもしれません。特殊な処理が必要です。
    システムの色の中で、alertViewの中の青は、定義されたシステムの色の範囲内ではなく、再読み込みが必要です。
    Hookシステムの色の処理
    完全性
    完全な個人情報が必要です。

    ここでiOS全体のAPPで灰色のテーマを実現するための例示的なコードについての記事を紹介します。もっと関連するiOS灰色のテーマの内容は以前の文章を検索してください。または下記の関連記事を引き続き閲覧してください。これからもよろしくお願いします。