国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

IOS中搖一搖實(shí)現(xiàn)截屏(可實(shí)現(xiàn)問題反饋的功能)

2019-11-14 20:40:23
字體:
供稿:網(wǎng)友

  有一段時(shí)間沒有更新博客了,今天更新一篇關(guān)于最近工作中用到的一個(gè)功能,先簡單描述一下:我們知道,測(cè)試人員在測(cè)試客戶端產(chǎn)品時(shí),當(dāng)出現(xiàn)問題或者BUG的時(shí)候,都得先對(duì)頁面截圖,然后從相冊(cè)中選擇截圖,加上一段描述放到TD庫或者直接通過郵件發(fā)給開發(fā)人員,以方便開發(fā)人員進(jìn)行修改,過程繁瑣。通過下面功能的介紹,您可以很方便的讓測(cè)試人員遇到BUG的時(shí)候,搖一搖設(shè)備,然后自動(dòng)截圖并保存到應(yīng)用的沙盒之中。截圖保存到沙盒之后,您可以自定義一個(gè)問題反饋的頁面,對(duì)問題進(jìn)行描述(描述可使用第三方平臺(tái),如訊飛語音,實(shí)現(xiàn)語音錄入的效果)之后,將描述信息和頁面截圖一起發(fā)送給開發(fā)人員(可以是郵件,也可以是直接發(fā)送到后臺(tái))。

  下面來看看功能是怎么實(shí)現(xiàn)的。

  首先,定義了一個(gè)category:ShakeAndCutter

  UIViewController+ShakeAndCutter.h文件源碼

#import <UIKit/UIKit.h>@interface UIViewController (ShakeAndCutter)@end

  UIViewController+ShakeAndCutter.m文件源碼:

 1 #import "UIViewController+ShakeAndCutter.h" 2 #import <QuartzCore/QuartzCore.h> 3 #import "TestFeedbackViewController.h" 4  5 @implementation UIViewController (ShakeAndCutter) 6  7 - (BOOL)canBecomeFirstResponder 8 { 9     return YES;10 }11 12 #PRagma mark - 搖一搖動(dòng)作處理13 14 - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event15 {16     NSLog(@"began");17 }18 19 - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event20 {21     NSLog(@"cancel");22 }23 24 - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event25 {26     NSLog(@"end");27     [self cutterViewToDocument];28     29     // 這里是自定義的問題反饋頁面,也可以直接跳轉(zhuǎn)到系統(tǒng)郵件發(fā)送的頁面30     TestFeedbackViewController *testFeedbackViewController = [[[TestFeedbackViewController alloc] initWithNibName:@"TestFeedbackViewController" bundle:nil] autorelease];31     [self.navigationController pushViewController:testFeedbackViewController animated:YES];32 }33 34 #pragma mark - 截屏處理35 36 - (void)cutterViewToDocument37 {38     UIWindow *screenWindow = [[UIapplication sharedApplication] keyWindow];39     40     UIGraphicsBeginImageContext(screenWindow.frame.size);41     [screenWindow.layer renderInContext:UIGraphicsGetCurrentContext()];42     UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();43     UIGraphicsEndImageContext();44     45     NSData *screenShotPNG = UIImagePNGRepresentation(screenShot);46     NSError *error = nil;47     [screenShotPNG writeToFile:[[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"error.png"] options:NSAtomicWrite error:&error];48 }49 50 @end

  至此,搖一搖和截圖功能就已經(jīng)完成了,那么在應(yīng)用中怎么使用呢?

  • 對(duì)于IOS6.0以上的設(shè)備,只需要在項(xiàng)目的pch文件中引進(jìn)頭文件#import "UIViewController+ShakeAndCutter.h"即可(我在IOS6.0.1IOS6.1.5IOS7.0.6設(shè)備上已經(jīng)測(cè)試過),這樣測(cè)試工作完成之后,您只需要將這行代碼注釋或者刪除就可以了;
  • 對(duì)于IOS6.0以下的設(shè)備,在需要實(shí)現(xiàn)搖一搖效果的頁面,有可能要加入如下代碼(手頭沒有IOS6.0以下的設(shè)備,如果大家有的話,幫忙驗(yàn)證一下,非常感謝):

  1.viewDidLoad方法中,添加兩行代碼:

1 [[UIApplication sharedApplication] setApplicationSupportsShakeToEdit:YES];2 [self becomeFirstResponder];

        2.viewDidAppear方法中,添加一行代碼:

1 [self becomeFirstResponder];

        3.viewDidDisappear方法中,添加一行代碼:

1 [self resignFirstResponder];

  當(dāng)然,以上的功能,您也可以實(shí)現(xiàn)其他的效果:比如說用戶問題的反饋等等,具體可以根據(jù)應(yīng)用的需求而定。

  

  這里,再附上發(fā)送到郵件功能的示例代碼:

  MailViewController.h文件源碼:

 1 #import <UIKit/UIKit.h> 2 #import <MessageUI/MessageUI.h> 3 #import<MessageUI/MFMailComposeViewController.h> 4  5 @interface MailViewController : UIViewController<MFMailComposeViewControllerDelegate, 6 MFMessageComposeViewControllerDelegate> 7 { 8     UIButton                    *shareToMailButton; 9 }10 11 @end

  MailViewController.m文件源碼:

  1 #import "MailViewController.h"  2 #import "Constants.h"  3   4 @interface MailViewController ()  5   6 @end  7   8 @implementation MailViewController  9  10 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 11 { 12     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 13     if (self) { 14         // Custom initialization 15     } 16     return self; 17 } 18  19 - (void)viewDidLoad 20 { 21     [super viewDidLoad]; 22     // Do any additional setup after loading the view. 23      24     self.title = @"Bug反饋"; 25      26     shareToMailButton = [self buttonWithFrame:CGRectMake(20, 100, 280, 40) action:@selector(btnClicked:) withTag:1000]; 27     [shareToMailButton setTitle:@"Bug反饋" forState:UIControlStateNormal]; 28 } 29  30 - (void)didReceiveMemoryWarning 31 { 32     [super didReceiveMemoryWarning]; 33     // Dispose of any resources that can be recreated. 34 } 35  36 #pragma mark - 自定義方法 37  38 - (void)btnClicked:(id)sender 39 { 40     UIButton *btnSender = (UIButton *)sender; 41      42     switch (btnSender.tag) 43     { 44         case 1000:  // 分享到郵箱 45         { 46             [self showMailPicker]; 47             break; 48         } 49         default: 50             break; 51     } 52 } 53  54 /******************************************************************************* 55  * 方法名稱:buttonWithFrame:action: 56  * 功能描述:初始化頁面按鈕,并添加到頁面視圖 57  * 輸入?yún)?shù): 58  * 輸出參數(shù): 59  ******************************************************************************/ 60 - (UIButton *)buttonWithFrame:(CGRect)frame action:(SEL)action withTag:(int)tag 61 { 62     UIImage *buttonBackgroundImage = [[UIImage imageNamed:@"button_background.png"] stretchableImageWithLeftCapWidth:5 topCapHeight:5]; 63     UIImage *disabledButtonBackgroundImage = [[UIImage imageNamed:@"button_background_disabled.png"] stretchableImageWithLeftCapWidth:5 topCapHeight:5]; 64      65     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 66     button.frame = frame; 67     [button setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal]; 68     [button setBackgroundImage:disabledButtonBackgroundImage forState:UIControlStateDisabled]; 69     [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 70     [button setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled]; 71     [button addTarget:self action:action forControlEvents:UIControlEventTouchUpInside]; 72     button.tag = tag; 73     [self.view addSubview:button]; 74      75     return button; 76 } 77  78 - (void)showMailPicker 79 { 80     Class mailClass = (NSClassFromString(@"MFMailComposeViewController")); 81      82     if (mailClass !=nil) 83     { 84         if ([mailClass canSendMail]) 85         { 86             [self displayMailComposerSheet]; 87         } 88         else 89         { 90             UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@""message:@"設(shè)備不支持郵件功能" delegate:self cancelButtonTitle:@"確定" otherButtonTitles:nil]; 91             [alert show]; 92             [alert release]; 93         } 94     } 95     else 96     { 97          98     } 99     100 }101 102 - (void)displayMailComposerSheet103 {104     MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];105     106     // 設(shè)置picker的委托方法,完成之后會(huì)自動(dòng)調(diào)用成功或失敗的方法107     picker.mailComposeDelegate = self;108     // 添加主題109     [picker setSubject:@"Bug反饋"];110     // 添加收件人111     NSArray *toRecipients = [NSArray arrayWithObject:@"279352257@QQ.com"];112     // 說明:也可以添加多個(gè)收件人,代碼如下所示:113 //    NSArray *toRecipients = [NSArray arrayWithObjects:@"one@qq.com",@"two@qq.com",nil];114     // 添加抄送115 //    NSArray *ccRecipients = [NSArray arrayWithObjects:@"second@qq.com",@"third@qq.com", nil];116     // 添加密送117 //    NSArray *bccRecipients = [NSArray arrayWithObject:@"fourth@qq.com"];118     119     [picker setToRecipients:toRecipients];120 //    [picker setCcRecipients:ccRecipients];121 //    [picker setBccRecipients:bccRecipients];122     // 發(fā)送圖片附件(其他格式的附件,可以都先轉(zhuǎn)化稱NSData類型,然后設(shè)置相應(yīng)的mimeType即可,如txt類型為@"text/txt",doc類型為@"text/doc",pdf類型為@"file/pdf"等等)123     NSData *myData = [NSData dataWithContentsOfFile:[[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"error.png"]];124     [picker addAttachmentData:myData mimeType:@"image/jpeg" fileName:@"error.png"];125     NSString *emailBody = [NSString stringWithFormat:@"<p>文字沒有全部顯示</p>"];126     127     // 直接在HTML代碼中寫入圖片的地址128 //    NSString *emailBody = [NSString stringWithFormat:@"<img src='http://p2.so.qhimg.com/t0130e3288d86929b97.jpg' /><p>我分享了圖片</p>"];129     130     [picker setMessageBody:emailBody isHTML:YES];131     [self presentModalViewController:picker animated:YES];132     [picker release];133 }134 135 136 - (void)mailComposeController:(MFMailComposeViewController*)controller137           didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error138 {139     switch (result)140     {141         case MFMailComposeResultCancelled:142             NSLog(@"Result: Mail sending canceled");  // 郵件發(fā)送取消  143             break;144         case MFMailComposeResultSaved:145             NSLog(@"Result: Mail saved");  // 郵件保存成功146             break;147         case MFMailComposeResultSent:148             NSLog(@"Result: Mail sent");  // 郵件發(fā)送成功149             break;150         case MFMailComposeResultFailed:151             NSLog(@"Result: Mail sending failed");  // 郵件發(fā)送失敗152             break;153         default:154             NSLog(@"Result: Mail not sent");155             break;156     }157     [self dismissModalViewControllerAnimated:YES];158 }159 160 - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result161 {162     NSLog(@"messageComposeViewController");163 }164 165 @end

 

 


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 仪陇县| 双辽市| 沿河| 皋兰县| 丰都县| 湾仔区| 巧家县| 尉氏县| 柏乡县| 剑河县| 三江| 滨海县| 益阳市| 临湘市| 贵定县| 冕宁县| 林周县| 镇原县| 榆林市| 汝阳县| 长治市| 砚山县| 九台市| 阿勒泰市| 华阴市| 石首市| 册亨县| 化隆| 博兴县| 临高县| 紫阳县| 扎赉特旗| 闽侯县| 绥化市| 长葛市| 宁安市| 兴安盟| 星座| 永春县| 荆门市| 谢通门县|