我在滚动视图和翻转视图中显示了一个webview,需要找到一种在Safari中点击时打开链接的方法(不在应用程序中)!
我会赞美任何帮助,因为我已经坚持了几个小时!
ArticleScrollVC.h
// ArticleScrollVC.h
#import <UIKit/UIKit.h>
#import "PagedScrollview.h"
#import "OMPageControl.h"
#define VIEW_FRONT_TAG 98765
#define VIEW_DESCR_TAG 98764
@interface ArticleScrollVC : UIViewController <PagedScrollDelegate>{
NSArray *articles;
NSMutableArray *pages;
IBOutlet PagedScrollView *scrollView;
IBOutlet OMPageControl *pageControl;
IBOutlet UIImageView *pageControlBG;
IBOutlet UIImageView *imageBG;
int currentPage;
}
@property (nonatomic,retain) NSArray *articles;
@property int currentPage;
- (void)resize;
- (void)changeViewMode;
+ (BOOL) showDescription;
- (IBAction) pageControlDidChange;
@end
// ArticleScrollVC.m
// ArticleScrollVC.m
#import "ArticleScrollVC.h"
#import "AsyncImageView.h"
#import "TabListViewController.h"
#import "ArticlePageVC.h"
#define PREFIX_TAG 666666
@implementation ArticleScrollVC
static BOOL showDescription = NO;
@synthesize articles;
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
[scrollView setScrollDelegate:self];
[scrollView setCurrentPage:currentPage];
pageControl.numberOfPages = 0;
[pageControl setImageNormal:[UIImage imageNamed:@"pageControlNormal.png"]];
[pageControl setImageCurrent:[UIImage imageNamed:@"pageControlCurrent.png"]];
}
- (int) numberOfPages{
pageControl.numberOfPages = [articles count];
if (pageControl.currentPage==0) {
[pageControl setCurrentPage:1];
[pageControl setCurrentPage:0];
}
//pages = [[NSMutableArray alloc] initWithCapacity:10];
return [articles count];
}
- (UIView*) viewForPage:(int)page{
UIDevice *dev = [UIDevice currentDevice];
NSString *deviceModel = dev.model;
ArticlePageVC *pageVC;
if([deviceModel isEqual:@"iPad"] || [deviceModel isEqual:@"iPad Simulator"]){
pageVC = [[[ArticlePageVC alloc] initWithNibName:@"ArticlePageIpad" bundle:nil] autorelease];
}else {
pageVC = [[[ArticlePageVC alloc] initWithNibName:@"ArticlePageVC" bundle:nil] autorelease];
}
pageVC.article = (ListItem *)[articles objectAtIndex:page];
pageVC.view.frame = scrollView.frame;
CGRect frame = scrollView.frame;
[pageVC resize:frame];
pageVC.view.tag = PREFIX_TAG+page;
return pageVC.view;
}
- (IBAction) pageControlDidChange{
[scrollView setCurrentPage:[pageControl currentPage]];
}
- (void) didChoosePage:(int)page{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
UIView *pageVC = [self.view viewWithTag:PREFIX_TAG+page];
UIViewAnimationTransition transition = !showDescription?UIViewAnimationTransitionFlipFromLeft:UIViewAnimationTransitionFlipFromRight;
[UIView setAnimationTransition:transition
forView:pageVC
cache:YES];
[self changeViewMode];
[UIView commitAnimations];
}
- (void) changeViewMode{
showDescription = !showDescription;
for (int page=0; page<[articles count]; page++) {
UIView *pageVC = [self.view viewWithTag:PREFIX_TAG+page];
[[pageVC viewWithTag:VIEW_DESCR_TAG] setHidden:!showDescription];
[[pageVC viewWithTag:VIEW_FRONT_TAG] setHidden:showDescription];
}
[scrollView setScrollEnabled:!showDescription];
[pageControl setHidden:showDescription];
}
- (void) scrollViewChangedPage:(NSNumber*)page{
pageControl.currentPage = [page intValue];
}
- (void) resize{
scrollView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
pageControl.frame = CGRectMake(20, self.view.frame.size.height-36, self.view.frame.size.width-40, 36);
pageControlBG.frame = pageControl.frame;
[imageBG setFrame:scrollView.frame];
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc. that aren't in use.
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
+ (BOOL) showDescription{
return showDescription;
}
- (void)dealloc {
[pages release];
[super dealloc];
}
@end
// ArticlePageVC.h
// ArticlePageVC.h
#import <UIKit/UIKit.h>
#import "TabListViewController.h"
#import "AsyncImageView.h"
#import "TabHTMLViewController.h"
@interface ArticlePageVC : UIViewController {
IBOutlet AsyncImageView *asyncImage;
IBOutlet UILabel *label;
IBOutlet UIImageView *labelBG;
IBOutlet UIWebView *body;
IBOutlet UILabel *detailLabel;
IBOutlet UIImageView *detailLabelBG;
IBOutlet UIImageView *pageControlBG;
ListItem *article;
}
@property (nonatomic,retain) ListItem *article;
- (void)resize;
@end
// ArticlePageVC.m
// ArticlePageVC.m
#import "ArticlePageVC.h"
#import "ArticleScrollVC.h"
@implementation ArticlePageVC
@synthesize article;
// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
/*
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization.
}
return self;
}
*/
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
[asyncImage changeContentMode:UIViewContentModeScaleAspectFit];
[asyncImage loadImageFromURL:[NSURL URLWithString:article.thumbnailURL]];
label.text = article.title;
detailLabel.text = article.title;
[body loadHTMLString:[article content] baseURL:nil];
[pageControlBG setImage:[UIImage imageNamed:@"page_control_bg.png"]];
body.scalesPageToFit = YES;
}
- (void) resize:(CGRect)frame{
UIDevice *dev = [UIDevice currentDevice];
NSString *deviceModel = dev.model;
// ArticlePageVC *pageVC;
if([deviceModel isEqual:@"iPad"] || [deviceModel isEqual:@"iPad Simulator"]){
self.view.frame = frame;
[body setFrame:CGRectMake(20, 130, frame.size.width-40, frame.size.height-130)];
[label setFrame:CGRectMake(40, frame.size.height-340, frame.size.width-100, 320)];
[asyncImage resize:CGRectMake(frame.origin.x+10, 0, asyncImage.frame.size.width-40, frame.size.height-286-2)];
[labelBG setFrame:CGRectMake(20, frame.size.height-320, frame.size.width-40, 284)];
[pageControlBG setFrame:CGRectMake(20, frame.size.height-36, frame.size.width-40, 36)];
}else {
self.view.frame = frame;
[body setFrame:CGRectMake(20, 120, frame.size.width-40, frame.size.height-120)];
[label setFrame:CGRectMake(40, frame.size.height-156, frame.size.width-100, 120)];
[asyncImage resize:CGRectMake(frame.origin.x+10, frame.origin.y+1, asyncImage.frame.size.width-40, frame.size.height-136-2)];
[labelBG setFrame:CGRectMake(20, frame.size.height-156, frame.size.width-40, 120)];
[pageControlBG setFrame:CGRectMake(20, frame.size.height-36, frame.size.width-40, 36)];
}
[[self.view viewWithTag:VIEW_DESCR_TAG] setHidden:![ArticleScrollVC showDescription]];
[[self.view viewWithTag:VIEW_FRONT_TAG] setHidden:[ArticleScrollVC showDescription]];
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc. that aren't in use.
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[super dealloc];
}
@end
答案 0 :(得分:1)
在视图控制器中采用UIWebViewDelegate协议,然后实现-webView:shouldStartLoadWithRequest:navigationType:这样它就会向应用程序发送带有url的-openURL:消息并返回NO以防止Web视图打开它。
答案 1 :(得分:0)
要处理来自其他应用程序(例如Safari)的开放URL,您需要register a URL scheme并在应用程序委托中实施application:openURL:sourceApplication:annotation:。例如,只要方案(andreas://the.url.doesnt/matter/because/your/app#parses-it
)是唯一的,您就可以andreas
。
点击与您的方案的链接将导致iOS委托您的应用程序如何解释此URL(使用上述消息)。我的第一个链接有例子。
要自定义用户点击应用程序中UIWebView中的链接时会发生什么,请使用UIWebViewDelegate
协议并实施webView:shouldStartLoadWithRequest:navigationType:
您可以返回NO
来阻止网络视图执行“默认”操作(即加载请求),而是执行...无论您想要什么,例如加载其他内容。