A
UIWebView
is like a browser.
See
Web
Views
in the iOS
Human
Interface Guidelines.
The
UIWebView
in this app displays the page
http://oit2.scps.nyu.edu/~meretzkm/INFO1-CE9236/src/html/preview.html
But a
UIWebView
is a browser with no back button or place to type a URL.
If you tap on the links to
www.filmratings.com
www.mpaa.org
,
AppDelegate
:
unchanged.
ViewController
:
added code to
viewDidLoad
.
preview.html
(not used until the exercise where we call
the
init(contentsOfFile:encoding:error)
method of class
String
)
Tell the view controller
that the class of the view it should create is
UIWebView
.
Select the
Main.storyboard
file in the Xcode Project Explorer.
Along the top of the center panel, select
Html > Html > Main.storyboard > Main.storyboard (base) > View Controller Scene > View Controller > View
In the right panel of Xcode, click on the Identity Inspector icon.
It’s a rectangle with a smaller rectangle in its upper left corner.
Custom Class
Class: UIWebView
Module: (leave it blank)
To add the text file
preview.html
to the project,
follow the instructions in exercise 5 in
States.
To launch in landscape orientation,
select the project at the top of the Xcode Project Explorer.
In the center panel of Xcode,
scroll down to
Deployment Info → Device Orientation
Uncheck all the orientations except Landscape Left.
loadView
method of class
ViewController
downloaded a file of HTML from the web into the
UIWebView
named
webView
.
let url: NSURL? = NSURL(string: "http://oit2.scps.nyu.edu/~meretzkm/INFO1-CE9236/src/html/preview.html"); if url == nil { print("could not create url"); return; } let request: NSURLRequest = NSURLRequest(URL: url!); webView.loadRequest(request); //Begin with the green band faded out. webView.alpha = 0; //Fade in the green band. UIView.animateWithDuration(2, delay: 1, options: UIViewAnimationOptions.CurveEaseInOut, animations: { self.view.alpha = 1; }, completion: nil);
preview.html
has already been added to the project.
It is a plain text file.
let bundle: NSBundle = NSBundle.mainBundle(); let filename: String? = bundle.pathForResource("preview", ofType: "html"); if filename == nil { print("could not find file preview.html"); return; } var error: NSError?; let html: String? = String(contentsOfFile: filename!, encoding: NSUTF8StringEncoding, error: &error); if html == nil { print("could not load file: \(error)"); return; } webView.loadHTMLString(html!, baseURL: nil);
.swift
files of the app.
Replace the above code with the following.
let html: String = "<HTML>" + "<HEAD>" + "<META NAME = \"viewport\" CONTENT = \"width = device-width\">" + "<STYLE TYPE = \"text/css\">" + "<!--" + "SPAN.big {font-size: 125%; font-weight: bold; padding: .33em;}" + "A:link {font-size: 75%; color: white; text-decoration: none;}" + "A:visited {font-size: 75%; color: white; text-decoration: none;}" + "-->" + "</STYLE>" + "</HEAD>" + "<BODY STYLE = \"background-color: green; margin: 0px;\">" + "<TABLE STYLE = \"" + "\tcolor: white;" + "\tmargin: auto;" + "\tfont: medium/200% Helvetica, sans serif;" + "\ttext-shadow: black .2em .2em 0;" + "\">" + "<TR>" + "<TD COLSPAN = \"2\"" + "STYLE = \"padding-top: 7em; padding-bottom: 7em; text-align: center;\">" + "THE FOLLOWING" + "<SPAN CLASS = \"big\">PREVIEW</SPAN>" + "HAS BEEN APPROVED FOR" + "<BR><SPAN CLASS = \"big\">ALL AUDIENCES</SPAN>" + "<BR>BY THE MOTION PICTURE ASSOCIATION OF AMERICA, INC." + "</TD>" + "</TR>" + "<TR>" + "<TD ALIGN = \"LEFT\">" + "<A HREF = \"http://www.filmratings.com/\">www.filmratings.com</A>" + "</TD>" + "" + "<TD ALIGN = \"RIGHT\">" + "<A HREF = \"http://www.mpaa.org/\">www.mpaa.org</A>" + "</TD>" + "</TR>" + "</TABLE>" + "" + "</BODY>" + "</HTML>"; webView.loadHTMLString(html, baseURL: nil);
viewDidLoad
method of class
ViewController
,
change the
completion:
parameter
nil
to the following closure.
{(b: Bool) -> Void in UIView.animateWithDuration(2, delay: 2, options: UIViewAnimationOptions.CurveEaseInOut, animations: { webView.alpha = 0;//fade back out }, completion: nil ); }
viewDidLoad
method of class
ViewController
,
change
"http://oit2.scps.nyu.edu/~meretzkm/INFO1-CE9236/src/html/preview.html"
"http://oit2.scps.nyu.edu/~meretzkm/INFO1-CE9236/src/html/evacuation.html"
"http://oit2.scps.nyu.edu/~meretzkm/swift/html/manhattan.html"
(go back to portrait).
The evacuation and manhattan examples contain JavaScript.
See this
Android app.
viewDidLoad
method of class
ViewController
,
change
preview.html
to
crawl.html
.
(Look at
crawl.html
with Safari.
In Firefox, remove the
-webkit-
prefixes, and change 40° to 25°.)
Comment out the fade-in;
start with the default
alpha
level of 1.
IMG
in the web page,
put the image file into the Supporting Files folder
and specify a base URL.
let bundle: NSBundle = NSBundle.mainBundle(); let path: String = bundle.bundlePath; let baseURL: NSURL? = NSURL.fileURLWithPath(path); if baseURL == nil { print("could not create URL"); return; } webView.loadHTMLString(html, baseURL: baseURL!);
UIWebView
.
Add the following methods to class
ViewController
.
//Called from the application delegate. override init(nibName: String?, bundle: NSBundle?) { super.init(nibName: nibName, bundle: bundle); } //not called required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder); } //We will no longer specify in Main.storyboard that the view controller //will create a UIWebView, so we will have to create the UIWebView here. override func loadView() { view = UIWebView(frame: CGRectZero); }Get rid of the fade in and fade out. Append the following code to
viewDidLoad
.
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: view, action: "goBack");In
Main.storyboard
,
create a
UINavigationController
instead of a
ViewController
.
Insert the following code immediately before the
return
statement in the
application(_:didFinishLaunchingWithOptions:)
method of the app delegate.
if window == nil { print("window is nil"); } else if window!.rootViewController == nil { print("window!.rootViewController is nil"); } else { let navigationController: UINavigationController = window!.rootViewController! as! UINavigationController; let viewController: ViewController = ViewController(nibName: nil, bundle: nil); navigationController.pushViewController(viewController, animated: false); }
To prevent the two links from disappearing off the bottom of the screen,
make the
padding-bottom
in the
.html
file smaller.
UITextField
?
viewDidLoad
.
navigationItem.leftBarButtonItem!.enabled = false;
Let the view controller act as the delegate of the web view:
class ViewController: UIViewController, UIWebViewDelegate {
//after let webView = view as! UIWebView; webView.delegate = self;
Add the following method to the delegate (which is also the view controller).
//Called when the UIWebView arrives at a new page. func webViewDidFinishLoad(webView: UIWebView) { if navigationItem.leftBarButtonItem != nil { if webView.canGoBack { navigationItem.leftBarButtonItem!.enabled = true; } else { navigationItem.leftBarButtonItem!.enabled = false; } } }You can write it more simply like this:
func webViewDidFinishLoad(webView: UIWebView) { if navigationItem.leftBarButtonItem != nil { navigationItem.leftBarButtonItem!.enabled = webView.canGoBack; } }
UIWebViewDelegate
.
func webView(webView: UIWebView, didFailLoadWithError error: NSError) { print("web view failed to load page: \(error)"); }
@"http://en.m.wikipedia.org/wiki/The_Third_Man"
,
where the first
m
stands for “mobile”.
Remove the
m.
and send a
User-Agent
HTTP header in the HTTP request instead.
NSURL *url = [NSURL URLWithString: @"http://en.wikipedia.org/wiki/The_Third_Man"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: url]; //Download the web page in mobile format. [request setValue: @"Mozilla/5.0 (iPhone)" forHTTPHeaderField: @"User-Agent"]; NSURLResponse *response; NSError *error; NSData *data = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error]; if (data == nil) { NSLog(@"could not load URL %@: %@", url, error); } else { [webView loadData: data MIMEType: @"text/html" textEncodingName: @"NSUTF8StringEncoding" baseURL: url]; }
Here are five examples of this header.
http://oit2.scps.nyu.edu:3001/
GET / HTTP/1.1 Host: oit2.scps.nyu.edu:3001 User-Agent: Mozilla/5.0 (iPhone Simulator; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: keep-alive
http://oit2.scps.nyu.edu:3001/
GET / HTTP/1.1 Host: oit2.scps.nyu.edu:3001 User-Agent: Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_10 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8E600 Safari/6533.18.5 Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: en-us Accept-Encoding: gzip, deflate Cookie: __utma=3868456.363797723.1320369206.1320369206.1320369206.1; __utmz=3868456.1320369206.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none) Connection: keep-alive
NSData
object
at the URL
http://oit2.scps.nyu.edu:3001/
NSData
object says to the web server:
GET / HTTP/1.1 Host: oit2.scps.nyu.edu:3001 User-Agent: Orson/1.0 CFNetwork/548.0.3 Darwin/10.8.0 Accept: */* Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: keep-alive
http://oit2.scps.nyu.edu:3001/
GET / HTTP/1.1 Host: oit2.scps.nyu.edu:3001 Accept-Encoding: gzip Accept-Language: en-US x-wap-profile: http://device.sprintpcs.com/Motorola/MOTOMB612/KRNSX41110.rdf User-Agent: Mozilla/5.0 (Linux; U; Android 2.2.2; en-us; MB612 Build/KRNS-X4-1.1.10) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Charset: utf-8, iso-8859-1, utf-16, *;q=0.7
http://oit2.scps.nyu.edu:3001/
GET / HTTP/1.1 Host: oit2.scps.nyu.edu:3001 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us Accept-Encoding: gzip, deflate Cookie: amlbcookie=724216000.36895.0000; AMAuthCookie=AQIC5wM2LY4SfcwPauQA9hv-LEaKnjfRHUzNtCk76c8jb6I.*AAJTSQACMDIAAlNLAAoxMjYyOTI3OTQwAAJTMQACMDY.* Connection: keep-alive