本篇的目的是開發一個自訂的彈出交談視窗組件,就是上面圖6中半透明的資訊提示視窗,其實系統類別庫中已經有UIActionSheet、UIAlertView能做到這樣的功能組件,但是顯示外觀不怎麼美觀而且跟我的這個設計不怎麼配,同時這2個組件的外觀自訂性很差幾乎改變不了顯示外觀,所以決定自己開發一個組件。實現的思路是這樣的,做一個繼承自UIWindow組件的組件的對象,這樣這個組件也就是一個UIWindow瞭然後在這個UIWindow中添加相應的半透明View達到顯示效果的目的,當我們需要顯示快顯視窗只需要把這個UIWindow設定為主顯示視窗即可,比如執行代碼:[self makeKeyAndVisible]。實現的思路很簡單了,現在開始具體動手。
一、用Xcode開啟上一篇完成的工程然後建立名為UIDialogWindow的Objective-C class類型的檔案,這個UIDialogWindow裡有3個從上到下的UIView組件和1個UIImageView構成,分別是作為根View的superView,作為遮罩view的backgroundView,作為半透明的圓角背景圖view的backgroundImage,作為視窗顯示內容view的view,關於這個內容view有點特別,這個由使用這個UIDialogWindow時候才進行提供,因為每個地方使用彈窗呈現的內容肯定是大不相同了,只有這樣才能提高組件的靈活性。
二、開啟UIDialogWindow.h檔案,具體代碼如下,在這個檔案中定義了上面提到的4個view,並且一個初始化方法,一個顯示視窗方法,一個關閉顯示視窗方法這些方法基本上能完成一個快顯視窗的功能任務了。
#import <Foundation/Foundation.h>
#import <QuartzCore/QuartzCore.h>
#import "Global.h"
@interface UIDialogWindow : UIWindow {
UIView *view; UIView *superView;
UIView *backgroundView;
UIImageView *backgroundImage;
BOOL isClose;
}
@property (nonatomic,retain)UIView *view;@property (nonatomic,retain)UIView *superView;@property (nonatomic,retain)UIView *backgroundView;
@property (nonatomic,retain)UIImageView *backgroundImage;
-(UIDialogWindow *)initWithView:(UIView *)aView;
-(void)show;-(void)close;
@end
二、開啟UIDialogWindow.m檔案,首先我們來完成初始化方法的編寫,初始化方法就是把上面提到的4個view按照一定的順序添加到window中,具體代碼如下,在這裡需要注意的是這個快顯視窗的顯示大小右內容view的尺寸決定,在初始化方法中會先擷取內容view的尺寸,然後根據這個尺寸調整其他3個view的尺寸。
-(UIDialogWindow *)initWithView:(UIView *)aView
{
if (self=[super init])
{
//內容view
self.view=aView;
[self setFrame:[[UIScreen mainScreen]bounds]]; self.windowLevel=UIWindowLevelStatusBar;
self.backgroundColor=[UIColor colorWithRed:0 green:0 blue:0 alpha:0.1];
//根view
UIView *sv=[[UIView alloc] initWithFrame:[self bounds]];
self.superView=sv;
[superView setAlpha:0.0f];
[self addSubview:superView];
[sv release];
CGFloat d=-7.0f;
UIView *bv=[[UIView alloc] initWithFrame:CGRectInset(CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height),d,d)]; self.backgroundView=bv;
//圓角圖片背景view
UIImageView *bi=[[UIImageView alloc] initWithImage:[[Global pngWithPath:@"dialog_bg2"]stretchableImageWithLeftCapWidth:13.0 topCapHeight:9.0]];
self.backgroundImage=bi;
[backgroundImage setFrame:[backgroundView bounds]];
[backgroundView insertSubview:backgroundImage atIndex:0];
[backgroundView setCenter:CGPointMake(superView.bounds.size.width/2, superView.bounds.size.height/2)];
[superView addSubview:backgroundView];
CGRect frame=CGRectInset([backgroundView bounds], -1*d, -1*d);
//顯示內容view
[backgroundView addSubview:self.view];
[self.view setFrame:frame];
isClose=NO;
[bv release];
[bi release];
}
return self;}
三、當初始化方法把這些view添加到window時同時設定了根view的為透明([superView setAlpha:0.0f]),這樣我們還是看不到顯示的這個快顯視窗了因為透明了,這個時候我們在編寫一個顯示快顯視窗的方法,這個代碼的實現非常的簡單了,其實還可以考慮加入一定的動畫效果,使得顯示的過程更加的具有彈出的動態過程效果