UIWebView上的夜间模式问题

时间:2013-12-12 08:52:59

标签: javascript ios objective-c uiwebview

我制作了一种使用UIWebView的阅读器。我想要包含一个夜间模式功能,它将文本白色和背景黑色,而不是白色背景上的普通黑色文本。

为此,我使用以下代码:

if (nightMode == YES)
{
    [self.view setBackgroundColor:[UIColor whiteColor]];
    NSString *setJavaScript = [[NSString alloc] initWithFormat:@"document.getElementsByTagName('body')[0].style.webkitTextFillColor= 'black'; document.getElementsByTagName('html')[0].style.backgroundColor= 'white'; DOMReady();"];
    [readerWebView stringByEvaluatingJavaScriptFromString:setJavaScript];
    [readerWebView.scrollView setBackgroundColor:[UIColor whiteColor]];
    [[NSUserDefaults standardUserDefaults] setBool:(NO) forKey:@"nightMode"];
    nightMode = NO;
}
else
{
    [self.view setBackgroundColor:[UIColor blackColor]];
    NSString *setJavaScript = [[NSString alloc] initWithFormat:@"document.getElementsByTagName('body')[0].style.webkitTextFillColor= 'white'; document.getElementsByTagName('html')[0].style.backgroundColor= 'black'; DOMReady();"];
    [readerWebView stringByEvaluatingJavaScriptFromString:setJavaScript];
    //[readerWebView setBackgroundColor:[UIColor blackColor]]; // doesn't solve it
    [readerWebView.scrollView setBackgroundColor:[UIColor blackColor]];
    [[NSUserDefaults standardUserDefaults] setBool:(YES) forKey:@"nightMode"];
    nightMode = YES;
}
[[NSUserDefaults standardUserDefaults] synchronize];

大多数时候这个作品都能找到,我得到了我期望的结果。但有时它看起来像这样:

screenshot

UIWebView中设置的边距应为黑色时保持白色,或者应为白色时保持黑色。这似乎是随机的!特别是因为它不是在整个网页上,而是从1024px开始(确切地说,是iPad屏幕的高度)。

有没有人知道如何解决这个问题?

它既可以在模拟器中也可以在真正的iPad上使用。

2 个答案:

答案 0 :(得分:0)

(假设这是我的HTML内容)。您正在从UIWebView外部处理此问题,我认为您需要将反转逻辑注入 Web视图。我建议你注入反转内容的CSS(如here所述)。你的缺点是,如果你还不知道CSS,你必须至少学习一些CSS,并且反转并不容易。但是,由于难以控制WebKit中的实现细节(在将来的版本中也存在很大的改变风险),因此可能很难找到问题的边缘情况。 / p>

答案 1 :(得分:0)

  • 您也可以将此代码用于白天和夜间模式。此代码可能符合您的需要。
  • 这适用于UIWebView

代码是:

BOOL isNightMode;

- (IBAction)nightModeBtn_click:(id)sender {
    isNightMode = YES;
    [self.webView reload];
}
- (IBAction)dayModeBtn_click:(id)sender {
    isNightMode = NO;
    [self.webView reload];
}

- (void)webViewDidFinishLoad:(UIWebView *)_webView{
  if(isNightMode == YES){
    [self.webView setOpaque:NO];
    NSString *setJavaScript = [[NSString alloc] initWithFormat:@" document.getElementsByTagName('body')[0].style.webkitFilter='grayscale(100%%)';document.getElementsByTagName('div')[0].style.webkitFilter='grayscale(100%%)'; DOMReady();"];
    [self.webView stringByEvaluatingJavaScriptFromString:setJavaScript];
  }
}