iOS开发:弹出框、进度条与键盘通知处理
立即解锁
发布时间: 2025-08-17 01:56:31 阅读量: 2 订阅数: 11 

### iOS开发:弹出框、进度条与键盘通知处理
#### 1. 弹出框(Popovers)的使用
弹出框主要用于在iPad屏幕上显示额外信息,例如在iPad的Safari应用中,点击书签按钮时,会弹出一个显示书签内容的弹出框。
##### 1.1 弹出框的基本特性
- **默认行为**:当用户点击弹出框区域外的地方时,弹出框会自动消失。不过,也可以设置在用户点击屏幕特定部分时不关闭弹出框。
- **内容展示**:弹出框通过视图控制器来展示内容,并且可以在弹出框内展示导航控制器,因为导航控制器是`UIViewController`的子类。
- **设备限制**:弹出框只能在iPad设备上使用。如果视图控制器的代码同时在iPad和iPhone上运行,需要确保不在非iPad设备上实例化弹出框。
- **展示方式**:
1. 从导航按钮(`UIBarButtonItem`的实例)内部弹出。
2. 从视图中的矩形区域弹出。
- **设备方向变化**:当设备方向改变(旋转设备)时,弹出框可能会被关闭或暂时隐藏。需要确保在方向改变稳定后,尽可能重新显示弹出框,以提供良好的用户体验。
##### 1.2 创建演示弹出框应用
以下是创建演示弹出框应用的详细步骤:
1. **创建项目**:在Xcode中创建一个单视图通用项目,并命名为`Displaying_Popovers_with_UIPopoverControllerViewController`。
2. **定义导航控制器**:在应用委托的头文件中定义一个导航控制器:
```objc
#import <UIKit/UIKit.h>
@class Displaying_Popovers_with_UIPopoverControllerViewController;
@interface Displaying_Popovers_with_UIPopoverControllerAppDelegate
: UIResponder <UIApplicationDelegate>
@property (nonatomic, strong) UIWindow *window;
@property (nonatomic, strong)
Displaying_Popovers_with_UIPopoverControllerViewController *viewController;
@property (nonatomic, strong) UINavigationController *navigationController;
@end
```
3. **实例化导航控制器**:在应用委托的实现文件中实例化导航控制器,并将其显示给用户:
```objc
#import "Displaying_Popovers_with_UIPopoverControllerAppDelegate.h"
#import "Displaying_Popovers_with_UIPopoverControllerViewController.h"
@implementation Displaying_Popovers_with_UIPopoverControllerAppDelegate
- (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
self.window = [[UIWindow alloc] initWithFrame:
[[UIScreen mainScreen] bounds]];
UIUserInterfaceIdiom uiIdiom = [[UIDevice currentDevice] userInterfaceIdiom];
NSString *viewControllerClass =
@"Displaying_Popovers_with_UIPopoverControllerViewController_iPad";
if (uiIdiom == UIUserInterfaceIdiomPhone) {
viewControllerClass =
@"Displaying_Popovers_with_UIPopoverControllerViewController_iPhone";
}
self.viewController =
[[Displaying_Popovers_with_UIPopoverControllerViewController alloc]
initWithNibName:viewControllerClass
bundle:nil];
self.navigationController = [[UINavigationController alloc]
initWithRootViewController:self.viewController];
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
return YES;
}
```
4. **定义弹出框控制器属性**:在视图控制器的定义文件中定义一个`UIPopoverController`类型的属性:
```objc
#import <UIKit/UIKit.h>
@interface Displaying_Popovers_with_UIPopoverControllerViewController
: UIViewController <UIAlertViewDelegate>
@property (nonatomic, strong) UIPopoverController *popoverController;
@property (nonatomic, strong) UIBarButtonItem *barButtonAdd;
@end
```
5. **创建弹出框内容视图控制器**:创建一个`UIViewController`的子类`PopoverContentViewController`,用于在弹出框中显示内容:
```objc
#import <UIKit/UIKit.h>
@interface PopoverContentViewController : UIViewController
@property (nonatomic, strong) UIButton *buttonPhoto;
@property (nonatomic, strong) UIButton *buttonAudio;
@property (nonatomic, weak) UIPopoverController *popoverController;
@end
```
6. **合成弹出框控制器**:在`PopoverContentViewController`的实现文件中合成弹出框控制器:
```objc
#import "PopoverContentViewController.h"
@implementation PopoverContentViewController
@synthesize popoverController;
...
```
7. **创建按钮并处理点击事件**:在`PopoverContentViewController`中创建两个按钮,并处理点击事件以关闭弹出框:
```objc
#import "PopoverContentViewController.h"
@implementation PopoverContentViewController
@synthesize popoverController;
- (BOOL) isInPopover{
Class popoverClass = NSClassFromString(@"UIPopoverController");
if (popoverClass != nil &&
UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad &&
self.popoverController != nil){
return YES;
} else {
return NO;
}
}
- (void) gotoAppleWebsite:(id)paramSender{
if ([self isInPopover]){
[self.popoverController dismissPopoverAnimated:YES];
} else {
/* Handle case for iPhone */
}
}
- (void) gotoAppleStoreWebsite:(id)paramSender{
if ([self isInPopover]){
[self.popoverController dismissPopoverAnimated:YES];
} else {
/* Handle case for iPhone */
}
}
- (void)viewDidLoad{
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.contentSizeForViewInPopover = CGSizeMake(200.0f, 125.0f);
CGRect buttonRect = CGRectMake(20.0f,
20.0f,
160.0f,
37.0f);
self.buttonPhoto = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[self.buttonPhoto setTitle:@"Photo"
forState:UIControlStateNormal];
[self.buttonPhoto addTarget:self
action:@selector(gotoAppleWebsite:)
forControlEvents:UIControlEventTouchUpInside];
self.buttonPhoto.frame = buttonRect;
[self.view addSubview:self.buttonPhoto];
buttonRect.origin.y += 50.0f;
self.buttonAudio = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[self.buttonAudio setTitle:@"Audio"
forState:UIControlStateNormal];
[self.buttonAudio addTarget:self
action:@selector(gotoAppleStoreWebsite:)
forControlEvents:UIControlEventTouchUpInside];
self.buttonAudio.frame = buttonRect;
[self.view addSubview:self.buttonAudio];
}
- (BOOL)shouldAutorotateToInterfaceOrientation
:(UIInterfaceOrientation)interfaceOrientation{
return YES;
}
@end
```
8. **创建导航按钮并处理点击事件**:在根视图控制器的`viewDidLoad`方法中创建导航按钮,并根据设备类型显示弹出框或警告视图:
```objc
- (void)viewDidLoad{
[super viewDidLoad];
Class popoverClass = NSClassFromString(@"UIPopoverController");
if (popoverClass != nil &&
UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){
PopoverContentViewController *content =
[[PopoverContentViewController alloc] initWithNibName:nil
bundle:nil];
self.popoverController = [[UIPopoverController alloc]
initWithContentViewController:content];
content.popoverController = self.popoverController;
self.barButtonAdd = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
target:self
action:@selector(performAddWithPopover:)];
} else {
self.barButtonAdd = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
target:self
action:@sel
```
0
0
复制全文
相关推荐










