其实最关键的代码就是这两个了。

IMPopoverController.h
 1 IMPopoverController.h
2 // IMPopoverController
3 //
4 // Created by yoyokko on 10-8-28.
5 // Copyright 2010 [email]yoyokko@gmail.com[/email]. All rights reserved.
6 //
7
8 #import <foundation foundation.h="">
9
10 @interface IMWindow : UIWindow
11 {
12 id delegate_;
13 }
14
15 @property (nonatomic, assign) id delegate;
16
17 @end
18
19
20 @interface IMPopoverController : NSObject {
21 UIViewController *contentViewController_;
22 IMWindow *popOverWindow_;
23 CGSize popOverSize_;
24 }
25
26 @property (nonatomic) CGSize popOverSize;
27
28 - (id) initWithContentViewController:(UIViewController *) con;
29 - (UIViewController *) contentViewController;
30 - (void) setContentViewController:(UIViewController *) newCon animated:(BOOL) animated;
31
32 - (void) presentPopoverFromRect:(CGRect) rect inView:(UIView *) inView animated:(BOOL) animated;
33 - (void) dismissPopoverAnimated:(BOOL) animated;
34
35 @end
36 </foundation>

IMPopoverController.m
  1 //
2 // IMPopoverController.m
3 // IMPopoverController
4 //
5 // Created by yoyokko on 10-8-28.
6 // Copyright 2010 [email]yoyokko@gmail.com[/email]. All rights reserved.
7 //
8
9 #import "IMPopoverController.h"
10
11 @implementation IMWindow
12
13 @synthesize delegate = delegate_;
14
15 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
16 {
17 [self.delegate touchesEnded:touches withEvent:event];
18 }
19
20 @end
21
22
23 @interface IMPopoverController (Private)
24
25 @property (nonatomic, retain) IMWindow *popOverWindow;
26
27 @end
28
29
30 @implementation IMPopoverController
31
32 @synthesize popOverSize = popOverSize_;
33
34 - (UIWindow *) popOverWindow
35 {
36 return popOverWindow_;
37 }
38
39 - (void) setPopOverWindow:(UIWindow *) newValue
40 {
41 if (popOverWindow_ != newValue)
42 {
43 [popOverWindow_ release];
44 popOverWindow_ = [newValue retain];
45 }
46 }
47
48 - (id) initWithContentViewController:(UIViewController *) con
49 {
50 if (self = [super init]) {
51
52 self.popOverWindow = [[[IMWindow alloc] initWithFrame:CGRectMake(0, 0, 320, 480)] autorelease];
53 self.popOverWindow.windowLevel = UIWindowLevelAlert;
54 self.popOverWindow.backgroundColor = [UIColor clearColor];
55 self.popOverWindow.hidden = YES;
56 self.popOverWindow.delegate = self;
57
58 [self setContentViewController:con animated:NO];
59 }
60 return self;
61 }
62
63 - (UIViewController *) contentViewController
64 {
65 return contentViewController_;
66 }
67
68 - (void) setContentViewController:(UIViewController *) newCon animated:(BOOL) animated
69 {
70 if (contentViewController_ != newCon) {
71 [contentViewController_ release];
72 contentViewController_ = newCon;
73 }
74 }
75
76 - (void) presentPopoverFromRect:(CGRect) rect inView:(UIView *) inView animated:(BOOL) animated
77 {
78 UIWindow *mainWin = [[[UIApplication sharedApplication] delegate] window];
79 CGRect newFrame = [mainWin convertRect:rect fromWindow:mainWin];
80 [[self contentViewController].view setFrame:CGRectMake(newFrame.origin.x, newFrame.origin.y, self.popOverSize.width, self.popOverSize.height)];
81 [self.popOverWindow addSubview:[self contentViewController].view];
82 self.popOverWindow.hidden = NO;
83 [self.popOverWindow makeKeyWindow];
84 }
85
86 - (void) dismissPopoverAnimated:(BOOL) animated
87 {
88 [self.popOverWindow resignKeyWindow];
89 self.popOverWindow.hidden = YES;
90 }
91
92 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
93 {
94 [self dismissPopoverAnimated:YES];
95 }
96
97 - (void) dealloc
98 {
99 self.popOverWindow = nil;
100 [super dealloc];
101 }
102
103 @end

附件是实例代码

 IMPopOverController.zip 

1、初始化UIPopoverController

    UIPopoverController *popover = [[UIPopoverController alloc]initWithContentViewController:navigationController]; 

  

//必须是个 ViewController

/*且该 ViewController的 viewDidLoad方法中要设置其在popover中的尺寸,如

    self.contentSizeForViewInPopover = CGSizeMake(300.0280.0);

*/


    self.recentSearchesPopoverController = popover;

    recentSearchesPopoverController.delegate = self;    //self要实现UIPopoverControllerDelegate协议


2、设置当popover弹出时,用户仍可以交互的视图

    // Ensure the popover is not dismissed if the user taps in the search bar.

    popover.passthroughViews = [NSArray arrayWithObject:searchBar];


3、展现popover

    [self.recentSearchesPopoverControllerpresentPopoverFromRect:self.searchBar.bounds

                                                          inView:self.searchBar

                                       permittedArrowDirections:UIPopoverArrowDirectionAny

                                                        animated:NO];

4、消失popover

//dismiss the popover.

    [recentSearchesPopoverController dismissPopoverAnimated:YES];

 

5、实现 UIPopoverControllerDelegate协议的方法

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {

}

 
 

1、初始化UIPopoverController

    UIPopoverController *popover = [[UIPopoverController alloc]initWithContentViewController:navigationController]; 

  

//必须是个 ViewController

/*且该 ViewController的 viewDidLoad方法中要设置其在popover中的尺寸,如

    self.contentSizeForViewInPopover = CGSizeMake(300.0280.0);

*/


    self.recentSearchesPopoverController = popover;

    recentSearchesPopoverController.delegate = self;    //self要实现UIPopoverControllerDelegate协议


2、设置当popover弹出时,用户仍可以交互的视图

    // Ensure the popover is not dismissed if the user taps in the search bar.

    popover.passthroughViews = [NSArray arrayWithObject:searchBar];


3、展现popover

    [self.recentSearchesPopoverControllerpresentPopoverFromRect:self.searchBar.bounds

                                                          inView:self.searchBar

                                       permittedArrowDirections:UIPopoverArrowDirectionAny

                                                        animated:NO];

4、消失popover

//dismiss the popover.

    [recentSearchesPopoverController dismissPopoverAnimated:YES];

 

5、实现 UIPopoverControllerDelegate协议的方法

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {

}

 

相关文章:

  • 2021-07-07
  • 2022-12-23
  • 2022-12-23
  • 2021-11-28
  • 2022-12-23
  • 2022-12-23
  • 2022-01-03
猜你喜欢
  • 2021-08-08
  • 2021-05-29
  • 2021-08-09
相关资源
相似解决方案