UIWebView Quickies

From macwrench
Jump to navigation Jump to search

Ein paar hilfreiche Tipps rund um die Klasse UIWebView:

  Logo informations.svg
Hinweis: die Klasse UIWebView ist von UIView abgeleitet und nicht von UIScrollView; sie enthält jedoch eine UIScrollView als subview, die dann wiederum angepasst werden kann.
 

Schatten von klickbaren Elementen entfernen

Mit den folgenden CSS-Definitionen können die grauen Schatten von klickbaren HTML-Elementen entfernt oder passend eingefärbt werden:

-webkit-tap-highlight-color:rgba(0,0,0,0);
-webkit-tap-highlight-color:blue;

lokale Bilder mit relativen Pfadangaben einbinden

Hierzu muss der Inhalt der WebView mit der korrekten baseURL geladen werden:

NSString *baseURL = [[NSBundle mainBundle] bundleURL];
[webView loadHTMLString:htmlString baseURL:baseURL];

Anschließend können Bilder in HTML und CSS wie gewohnt relativ adressiert werden.

Links aus einer WebView in MobileSafari öffnen

Mit Hilfe der Delegate-Methode shouldStartLoadWithRequest in UIWebViewDelegate

webView:webView shouldStartLoadWithRequest:request navigationType:(UIWebViewNavigationType)navigationType

können Links in einer WebView wahlweise im MobileSafari geöffnet werden:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if ([[[request URL] absoluteString] isEqual:@"http://www.example.com/path/"]) {
        return YES;
    }
    [[UIApplication sharedApplication] openURL:[request URL]];
    
    return NO;
}

Wenn "NO" (oder "FALSE") zurückgegeben wird, wird der Link nicht in der WebView geöffnet sondern stattdessen an die Methode [UIApplication openURL:] weitergeleitet. Hier kann dann noch mit Hilfe einer UIAlertView rückgefragt werden, ob die Appliation verlassen und der Link im Safari geöffnet werden soll.

Bouncen und/oder Scrollen deaktivieren

Offiziell ist UIWebView ja direkt von UIView abgeleitet, verwendet aber intern offensichtlich eine UIScrollView für die Darstellung der Inhalte. Daher lässt sich auch mit Hilfe des folgenden Stückchen Codes sowohl das Bouncing als auch das Scrollen einer UIWebView deaktivieren:

UIScrollView* sv = nil;
for(UIView* v in self.webView.subviews){
	if([v isKindOfClass:[UIScrollView class]]){
		sv = (UIScrollView*)v;
		sv.scrollEnabled = NO;
		sv.bounces = NO;
	}
}

Wichtig: Bei Verwendung der privaten Methode setAllowsRubberBanding wird die App beim Einreichen in den App-Store höchstwahrscheinlich abgelehnt, daher ist obige Methode zu bevorzugen.

Scrollgeschwindigkeit anpassen

Genau genommen kann man die Scrollgeschwindigkeit gar nicht anpassen, die Geschwindigkeit beim Abbremsen (decelerating) beim Scrollen jedoch schon. Dies allerdings auch nur in genau zwei Stufen, nämlich:

mySollView.decelerationRate = UIScrollViewDecelerationRateNormal;
mySollView.decelerationRate = UIScrollViewDecelerationRateFast;

Ersteres ist die Standardeinstellung, zweiteres bewirkt ein schnelleres Abbremsen - d.h. die ScrollView scrollt einfach nicht so weit, wie in der normalen Einstellung. Dies funktioniert übrigens seit iOS 3.0

In Verbindung mit einer UIWebView sieht das dann so aus:

UIScrollView* sv = nil;
for(UIView* v in self.webView.subviews){
	if([v isKindOfClass:[UIScrollView class]]){
		sv = (UIScrollView*)v;
		[sv setDecelerationRate:UIScrollViewDecelerationRateFast];
	}
}

Schlagschatten beim Bouncen entfernen

Um den lästigerweise fest vorgegebenen Schlagschatten einer UIWebView dauerhaft loszuwerden, genügt das folgende kleine Stück Quellcode:

if ([[self.webView subviews] count] > 0) {
	for (UIView* shadow in [[[self.webView subviews] objectAtIndex:0] subviews]) {
		[shadow setHidden:YES];
	}
	[[[[[self.webView subviews] objectAtIndex:0] subviews] lastObject] setHidden:NO];
}

Transparente UIWebView

[self.webView setOpaque:NO];
[self.webView setBackgroundColor:[UIColor clearColor]];

Außerdem ist darauf zu achten, dass im HTML-Code keine Hintergrundfarbe gesetzt ist bzw. diese den Wert transparent oder rgba(0,0,0,0)hat.

Siehe auch

Apple Reference Library