http://startupmeme.com/wp-content/uploads/2008/09/stanza-on-iphone.png
我希望实现像着名的Stanza应用程序截图所示的功能。
在UI格式的帮助下以html格式显示内容
点击UIWebView会显示两个叠加控件(顶部和底部)
底部工具栏由控件和控件组成。一个用于分页的滑块
请帮忙。
我将如何通过以下方式实现上述目标:
如何构建这些自定义控件?
单击时,我将如何覆盖这些控件?
如何组合UIToolbar(包含控件)&滑块?
此外还需要过渡滑动效果,顶部标题来自屏幕顶部,底部控制&滑块来自屏幕底部。我将如何实现这一目标?
请详细帮助我(a) - (d)。一些代码指南会非常有用。
由于
答案 0 :(得分:5)
我在最近一直在做的项目中正在寻找你正在寻找的东西。
基本上我在UINavigationController中有一个UIWebView,UIToolbar作为UIWebView的兄弟。我使用IB设置了所有这些的布局,以创建链接到我的视图控制器类的nib。我认为你知道如何使用IB以及如何正确设置所有代表,IBOutlets等,所以不会在这里讨论。
您需要在视图控制器中实现适当的委托,以实现所有工作。这是我的视图控制器类的接口:
@interface MyViewController : UIViewController <UIWebViewDelegate, UIGestureRecognizerDelegate> {
}
@property (retain) IBOutlet UIWebView *webView;
@property (retain) IBOutlet UINavigationItem *navigationItem;
@property (retain) IBOutlet UIToolbar *toolbar;
- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer;
// UIGestureRecognizerDelegate methods
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
// UIWebViewDelegate methods
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
- (void)webViewDidStartLoad:(UIWebView *)webView;
- (void)webViewDidFinishLoad:(UIWebView *)webView;
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
@end
从技术上讲,您所询问的只需要UIGestureRecognizerDelegate实现,但我认为您将在webView中做一些有趣的事情,因此也希望实现UIWebViewDelegate
我发现为这三个UGestureRecognizer委托方法实现以下内容至关重要,因为UIWebView也识别了点击,所以这一切都能正常工作:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
return YES;
}
我在我的控制器的viewDidLoad方法中的webView上注册了一个UITapGestureRecognizer:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
// I perform other appropriate initialization here like adding or removing items from the navigation bar or toolbar
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];
tapRecognizer.numberOfTapsRequired = 1;
tapRecognizer.delegate = self;
[self.webView addGestureRecognizer:tapRecognizer];
[tapRecognizer release];
}
这是我的handleTapFrom回调:
- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer
{
CGPoint location = [recognizer locationInView:self.navigationController.topViewController.view];
CGRect bounds = self.navigationController.topViewController.view.bounds;
if (location.x < bounds.size.width / 5.0) {
// This is in the left most quadrant
// I implement code here to perform a "previous page" action
} else if (location.x > bounds.size.width * 4.0 / 5.0) {
// This is in the right most quadrant
// I implement code here to perform a "next page" action
} else if ((location.x > bounds.size.width / 3.0) && (location.x < bounds.size.width * 2.0 / 3.0)) {
// This is in the middle third
BOOL hidden = [self.navigationController isNavigationBarHidden];
// resize the height of self.webView1, self.webView2, and self.webView3 based on the toolbar hiding / showing
CGRect webViewControllerFrame = self.webView.frame;
webViewControllerFrame.size.height += (hidden ? -44 : 44);
self.webView.frame = webViewControllerFrame;
// I hide all of the upper status bar and navigation bar, and bottom toolbar for a clean reading screen
[[UIApplication sharedApplication] setStatusBarHidden:!hidden];
[self.navigationController setNavigationBarHidden:!hidden animated:YES];
self.toolbar.hidden = !hidden;
// I perform content relayout here in the now modified webView screen real estate
}
}
这个基本框架让我走了,希望能回答你的问题,或者至少指出你正确的方向。
注意:
我还没有处理过这样一个事实,即我可能会将点击解释为“显示/隐藏状态/导航/工具栏”,并且UIWebView可能会像点击链接那样在同一个点击中操作,等等。我打算在寻找很快... ...
您在Stanza屏幕截图中显示的透明度并不是什么大问题。您必须使用各种导航/工具栏上的alpha设置来完成此操作,并更改上面UIWebView上的调整大小代码。事实上,我会定期覆盖一个额外的半透明工具栏,用于临时状态,警报等,并且不要调整UIWebView的大小,使其位于下方,并且通过此警报工具栏仍然可见。
答案 1 :(得分:0)
bg清楚地了解iPhone机制,所以肯定会在那里+1,但我可能知道另一种方式。
将按钮(或视图)叠加到顶部。
根据需要注册一个点按捕手(识别器,触摸以[[event touches] tapCount]或IB结束,或手动操作...基本上抓住水龙头。)
点击后,保存它的位置,调用一个通知你的网页视图分割的功能(或者如果它像是节,说是添加叠加层)然后通过“伪造”来通过视图发送触摸触摸,类似于:Is there a way to pass touches through on the iPhone?
或创建自己的目标操作方法并发送(可能更容易)。
如果您了解SDK,上述内容应该对您有意义。特别是视图和所有相关的内容(除了图形,你可以跳过那个阅读)