I want to display html text on a label(TTStyleLabel). I am receieving text in form of html. How do I calculate height of html string?
To get height of html text you need to put that html info uiwebview. After loading the html in uiwebview you can get its height in its delegate methods like this -
- (void)viewDidLoad
{
[super viewDidLoad];
webview.delegate = self;
[webview loadHTMLString:#"<div id='foo' style='background: red'>The quick brown fox jumped over the lazy dog.</div>" baseURL:nil];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSString *output = [webview stringByEvaluatingJavaScriptFromString:#"document.getElementById(\"foo\").offsetHeight;"];
NSLog(#"height: %#", output);
}
But if you are not displaying the text on the screen using the webview (as you are using a TTStyleLabel) you can hide the webview and load the html in it. You need to perform some tricks.
Related
Font for one of our Urdu based app is "Jameel Noori Nastaleeq Kasheeda". We are supposed to show content (on UILabel) after converting its HTML text to NSString.
For converting HTML to NSString, we have implemented following functions,
-(NSString *)styledHTMLwithHTML:(NSString *)HTML{
NSString *style = #"<meta charset=\"UTF-8\"><style> body { font-family: 'Jameel-Noori-Nastaleeq'; font-size: 20px; } b {font-family: 'Jameel-Noori-Nastaleeq'; }</style>";
return [NSString stringWithFormat:#"%#%#", style, HTML];
}
- (NSAttributedString *)attributedStringWithHTML:(NSString *)HTML {
NSDictionary *options = #{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType };
return [[NSAttributedString alloc] initWithData:[HTML dataUsingEncoding:NSUTF16StringEncoding] options:options documentAttributes:NULL error:NULL];
}
Then we are setting UILabel's attributedTextproperty to get properly formatted NSString based on HTML text.
NSString *styledHtml = [self.novel.article styledHTMLwithHTML:self.novel.article];
NSAttributedString *attributedText = [self.novel.article attributedStringWithHTML:styledHtml];
self.articleView.articleContent.attributedText = attributedText;
This implementation is working as per expectation of default iOS fonts like Arial or Helvetica but text is overlapping when we applied custom Urdu font i.e. Nastaleeq. Any help in this regard would be highly appreciated.
You can implement webview to load your html string like,
NSString* htmlString = #"your html string here";
[webView loadHTMLString:htmlString baseURL: nil]; //webView is `UIWebView` object
I am using CoreTextView on iOS to render an html file in a UIScrollview that is set up programmatically. As soon as the html file exceeds a certain length, the text no longer renders. It does not seem to be a problem with:
Memory. NSLog displays the entire NSAttributedString no matter how long it is.
A formatting error in the html file. I was able to render the entire file in pieces.
If I put in a very large height for the frame, same thing: empty screen and no errors to troubleshoot. I suspect that the issue has something to do with calculating file size and maybe... font line size? Stumped. Incidentally, if I enter a custom font, it is ignored and only the default Helvetica is displayed. Font SIZES, however, render correctly. Any help on getting the entire file to display would be much appreciated!
My code:
m_coreText = [[CoreTextView alloc] initWithFrame:CGRectZero];
m_coreText.backgroundColor = [UIColor clearColor];
m_coreText.contentInset = UIEdgeInsetsMake(10, 10, 10, 10);
NSString* html = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:#"terms" ofType:#"html"] encoding:NSUTF8StringEncoding error:NULL];
m_coreText.attributedString = [NSAttributedString attributedStringWithHTML:html renderer:^id<HTMLRenderer>(NSMutableDictionary* attributes) {
CustomRenderer* renderer=[[CustomRenderer alloc] init];
renderer.type=attributes[#"type"];
renderer.size=CGSizeMake(16, 16);
return renderer;
}];
m_coreText.frame = CGRectMake(0, 0, self.view.bounds.size.width, [m_coreText sizeThatFits:CGSizeMake(self.view.bounds.size.width, MAXFLOAT)].height);
UIScrollView* scroll = [[UIScrollView alloc] initWithFrame:self.view.bounds];
scroll.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
scroll.contentSize=m_coreText.frame.size;
[scroll addSubview:m_coreText];
[self.view addSubview:scroll];
I'm trying to open one link in safari when i click the UIWebview (its like ad display).
Following code am using but what happend is when i click the webview its opening inside UIWebview for some links (not all).
- (BOOL)webView:(UIWebView *)webView1 shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
if (webView1==webview) {
if (UIWebViewNavigationTypeLinkClicked == navigationType) {
[[UIApplication sharedApplication] openURL:[request URL]];
return NO;
}
return YES;
}
}
what happens here is if any text link in that UIWebView then its opening correctly ,But if a UIWebview with images then its opening in same UIWebview instead of a new browser.
MY CURRENT CODE
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:#"http://www.example.com/files/ad.htm"]]];
[_webView setBackgroundColor:[UIColor clearColor]];
[_webView setOpaque:NO];
_webView.scrollView.bounces = NO;
}
-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
if ( inType == UIWebViewNavigationTypeLinkClicked ) {
[[UIApplication sharedApplication] openURL:[inRequest URL]];
return NO;
}
return YES;
}
Seems like those images has been linked using anchor tags...
Try this...
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
static NSString *reguler_exp = #"^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9-]*[a-zA-Z0-9])[.])+([A-Za-z]|[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9])$";
//Regular expression to detect those certain tags..You can play with this regular expression based on your requirement..
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:#"SELF MATCHES %#", reguler_exp];
//predicate the matched tags.
if ([resultPredicate evaluateWithObject:request.URL.host]) {
[[UIApplication sharedApplication] openURL:request.URL];
return NO;
} else {
return YES;
}
}
EDIT: Don't allow this delegate method to get called for the first time.Add some logic that it won't get called for the 1st time loading the webview.
(SOP's new requirement,see below comment)
How to to detect the touch on uiwebview,
1)Add the tapgesture to your webview.(before that add UIGestureRecognizerDelegate in your viewcontroller.h)
example:
UITapGestureRecognizer* singleTap=[[UITapGestureRecognizer alloc]initWithTarget:self action:#selector(handleSingleTap:)];
singleTap.numberOfTouchesRequired=1;
singleTap.delegate=self;
[webview addGestureRecognizer:singleTap];
2)Then add this delegate method,
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
//return YES,if you want to control the action natively;
//return NO,in case your javascript does the rest.
}
Note: In case you want to check whether the touch is native or htmml(javascript) check the nice little tutorial here,about handling the javascript events etc....Hope this helps you..
I have created a UIWebView, banner sized, which is a subview of my UITabBar. I have placed it right on top of the tab bar. I know I have done this correctly since loading for example google.com gives me the exact appearance I am after.
For my banner though, I want to load a picture from my Google Drive account. This appears to be to small because it does not fill the web view when I am running on iPad and I therefore end up with an annoying space between the banner and the tab bar, respectively between the banner and the right screen edge.
Is there any way I can scale the content to exactly fit the web view?
EDIT: The code which I am using to show the image in the web view:
// Tab bar initialization
TabbeBarreViewController *tabViewController = [[TabbeBarreViewController alloc] init];
[tabViewController setViewControllers:viewControllers];
// Banner set up
CGSize tabBarSize = [[tabViewController tabBar] bounds].size;
UIWebView *wv = [[UIWebView alloc] initWithFrame:CGRectMake(0, [UIScreen mainScreen].bounds.size.height - tabBarSize.height - tabBarSize.width/4.0, tabBarSize.width, tabBarSize.width/4.0)];
[wv setOpaque:NO];
[wv setBackgroundColor:[UIColor clearColor]];
[wv setHidden:YES];
[[wv scrollView] setScrollEnabled:NO];
[wv loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:#"https://docs.google.com/drawings/d/11MLox_3u0iqNwk3UdmCd4YHWYMSLxzbkyfgQjUJuSko/pub?w=606&h=152"]]];
[[tabViewController view] addSubview:wv];
[wv setDelegate:self];
// Presenting tab bar with subview banner
[self presentViewController:tabViewController animated:YES completion:nil];
and
- (void)webViewDidFinishLoad:(UIWebView *)theWebView
{
CGSize contentSize = theWebView.scrollView.contentSize;
CGSize viewSize = self.view.bounds.size;
float rw = viewSize.width / contentSize.width;
theWebView.scrollView.minimumZoomScale = rw;
theWebView.scrollView.maximumZoomScale = rw;
theWebView.scrollView.zoomScale = rw;
theWebView.hidden = NO;
}
You can try small piece of HTML code here to load content into the webview as below
NSString *HTML=#"<html><body padding=\"0\"><img src=\"imgurl\" width=\"100%\" height=\"100%\"/></body></html>";
[self.webview loadHTMLString:HTML baseURL:nil];
Edit
Or, you can add a UIImageView instead like below
UIImage *image=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:#"YOURIMAGEURL"]]];
self.imagView.image=image;
I have a form sheet segue that should display hard-coded html page.
Now I have a two part problem first problem is
<CENTER><H1>A Simple Sample Web Page</H1><H4>By Frodo</H4>
<H2>Demonstrating a few HTML features</H2></CENTER>
is displayed like
I can change <CENTER>tag to <left> in that case it works but it limits my options. How can I display this content In the middle of the screen without alignment issues?
Second part of the question is How can I embed a color or a link to content. On line ""FFFFFF">\n" I get the error that says Expected ':' and on line "<a href="http://somegreatsite.com">\n" Half of the line is green which is seems like comment on the screen that means it will not executed by XCode
My full code is like :
- (void) createWebViewWithHTML{
//create the string
NSMutableString *html = [NSMutableString stringWithString: #"<html><head><title></title></head><body style=\"background:transparent;\">"];
//continue building the string
[html appendString:#"<BODY BGCOLOR="
""FFFFFF">\n"
"<CENTER><IMG SRC="clouds.jpg" ALIGN="BOTTOM">
"</CENTER> \n"
"<HR>\n"
"<a href="http://somegreatsite.com">\n"
"Link Name</a>\n"
"is a link to another nifty site\n"
"<H1>This is a Header</H1>\n"
"<H2>This is a Medium Header</H2>\n"
"Send me mail at <a href="mailto:support#yourcompany.com">\n"
"support#yourcompany.com</a>.\n"
"<P> This is a new paragraph!\n"
"<P> <B>This is a new paragraph!</B>\n"
"<BR> <B><I>This is a new sentence without a paragraph break, in bold italics.</I></B>\n"
"<HR>\n"];
[html appendString:#"</body></html>"];
//instantiate the web view
webView = [[UIWebView alloc] initWithFrame:self.view.frame];
//make the background transparent
[webView setBackgroundColor:[UIColor clearColor]];
//pass the string to the webview
[webView loadHTMLString:[html description] baseURL:nil];
//add it to the subview
[self.view addSubview:webView];
}
Edit::
Added story board picture
So how can I make correct alignment and embed color/link correctly?
Check if your UIWebView has the right size. It seems to be bigger than the screen.
Place a \ before any " in your hard-coded string.
e.g.:
NSString *testString="This is a \"Test\"";
results in
This is a "Test"
Hope this helps