Commit 8306479e4a361099474e866e70f70f94b19097cf

Authored by zhangxiaowen
1 parent b059b30a

no message

CNLiveQrCodeModule.podspec
... ... @@ -49,7 +49,7 @@ TODO: 网家家-二维码模块.
49 49 s.dependency 'CNLiveTripartiteManagement/SDWebImage'
50 50 s.dependency 'CNLiveTripartiteManagement/Masonry'
51 51 s.dependency 'CNLiveTripartiteManagement/MJExtension'
52   - s.dependency 'SGQRCode'
  52 + s.dependency 'SGQRCode', '3.0.1'
53 53  
54 54 # 服务层
55 55 s.dependency 'CNLiveServices'
... ...
CNLiveQrCodeModule/Assets/CNLiveQrCodeModule.xcassets/code_back_black_b.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "idiom" : "universal",
  9 + "filename" : "code_back_black_b@2x.png",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "filename" : "code_back_black_b@3x.png",
  15 + "scale" : "3x"
  16 + }
  17 + ],
  18 + "info" : {
  19 + "version" : 1,
  20 + "author" : "xcode"
  21 + }
  22 +}
0 23 \ No newline at end of file
... ...
CNLiveQrCodeModule/Assets/CNLiveQrCodeModule.xcassets/code_back_black_b.imageset/code_back_black_b@2x.png 0 → 100644

1.49 KB

CNLiveQrCodeModule/Assets/CNLiveQrCodeModule.xcassets/code_back_black_b.imageset/code_back_black_b@3x.png 0 → 100644

1.79 KB

CNLiveQrCodeModule/Classes/Controller/CNLiveGroupQrCodeController.h
... ... @@ -14,9 +14,11 @@
14 14 #import <UIKit/UIKit.h>
15 15  
16 16 NS_ASSUME_NONNULL_BEGIN
  17 +@class IMAGroup;
17 18  
18 19 @interface CNLiveGroupQrCodeController : UIViewController
19 20 @property (nonatomic, assign) BOOL isScanCode;
  21 +@property (nonatomic, strong) IMAGroup *group;
20 22  
21 23 @end
22 24  
... ...
CNLiveQrCodeModule/Classes/Controller/CNLiveGroupQrCodeController.m
... ... @@ -7,67 +7,190 @@
7 7 //
8 8  
9 9 #import "CNLiveGroupQrCodeController.h"
10   -
  10 +#import <Masonry/Masonry.h>
11 11 #import "QMUIKit.h"
  12 +#import "SGQRCode.h"//二维码库
12 13  
13 14 #import "CNLiveQrCodeNavigationBar.h"
  15 +#import "CNLiveGroupQrcodeView.h"
  16 +#import "CNLiveQrCodeNavigationBar.h"
14 17  
15   -@interface CNLiveGroupQrCodeController()
  18 +@interface CNLiveGroupQrCodeController ()<CNLiveQrCodeNavigationBarDelegate>
  19 +@property (nonatomic, strong) CNLiveQrCodeNavigationBar *navigationBar;
  20 +@property (nonatomic, strong) CNLiveGroupQrCodeView *groupView;
  21 +@property (nonatomic, strong) UIButton *save;
  22 +@property (nonatomic, strong) UIButton *share;
16 23  
17 24 @end
18 25  
19 26 @implementation CNLiveGroupQrCodeController
20   -static const NSInteger kHEIGHT = 250;
21   -
22   -#pragma mark - 加载数据
23   -- (void)loadData {
24   -
25   -
26   -}
27   -
  27 +static const NSInteger margin = 10;
28 28 #pragma mark - 生命周期
29 29 - (void)viewWillAppear:(BOOL)animated{
30 30 [super viewWillAppear:animated];
31 31 self.navigationController.navigationBarHidden = YES;
32   -
33 32 }
34 33  
35 34 - (void)viewDidLoad {
36 35 [super viewDidLoad];
37   - self.view.backgroundColor = [UIColor colorWithRed:244.0/255.0 green:244.0/255.0 blue:244.0/255.0 alpha:1.0];
38   - [self createSubViews];
39   - [self loadData];
40   -}
41   -
42   -- (void)dealloc {
  36 + // Do any additional setup after loading the view.
  37 + self.view.backgroundColor = [UIColor colorWithRed:245/255.0 green:245/255.0 blue:249/255.0 alpha:1.0];
  38 + [self.view addSubview:self.navigationBar];
  39 + [self.view addSubview:self.groupView];
43 40  
  41 + [self.view addSubview:self.save];
  42 + CGFloat width = (SCREEN_WIDTH-6*margin)/2.0;
  43 + [self.save mas_makeConstraints:^(MASConstraintMaker *make) {
  44 + make.left.mas_equalTo(self.view.mas_left).mas_offset(2.5*margin);
  45 + make.top.mas_equalTo(self.groupView.mas_bottom).mas_offset(2*margin);
  46 + make.width.mas_equalTo(width);
  47 + make.height.mas_equalTo(40);
  48 +
  49 + }];
44 50  
  51 + [self.view addSubview:self.share];
  52 + [self.share mas_makeConstraints:^(MASConstraintMaker *make) {
  53 + make.left.mas_equalTo(self.save.mas_right).mas_offset(margin);
  54 + make.top.mas_equalTo(self.save.mas_top);
  55 + make.width.mas_equalTo(self.save.mas_width);
  56 + make.height.mas_equalTo(self.save.mas_height);
  57 +
  58 + }];
45 59 }
46 60  
47   -- (void)createSubViews {
48   -
  61 +/*
  62 +#pragma mark - Navigation
  63 +
  64 +// In a storyboard-based application, you will often want to do a little preparation before navigation
  65 +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
  66 + // Get the new view controller using [segue destinationViewController].
  67 + // Pass the selected object to the new view controller.
49 68 }
  69 +*/
50 70  
51   -#pragma mark - 状态栏
52   -/**
53   - * 状态栏的颜色
54   - *
55   - * @return UIStatusBarStyle
56   - *
57   - */
58   -- (UIStatusBarStyle)preferredStatusBarStyle{
59   - return UIStatusBarStyleLightContent;
60   -
  71 +#pragma mark - 代理
  72 +- (void)navigationBar:(CNLiveQrCodeNavigationBar *)navigationBar actionEvents:(NSString *)actionEvents{
  73 + if ([actionEvents isEqualToString:@"1"]) {
  74 + [self goBack];
  75 + }
61 76 }
62 77  
63 78 #pragma mark - 懒加载
64   -
  79 +- (CNLiveQrCodeNavigationBar *)navigationBar {
  80 + if (!_navigationBar) {
  81 + _navigationBar = [[CNLiveQrCodeNavigationBar alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, NavigationContentTop)];
  82 + _navigationBar.backgroundColor = [UIColor whiteColor];
  83 + _navigationBar.delegate = self;
  84 + UIImage *image = [self xw_getImageName:@"code_back_black_b" bundleName:@"CNLiveQrCodeModule" targetClass:[CNLiveGroupQrCodeController class]];
  85 + [_navigationBar.left setImage:[image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forState:UIControlStateNormal];
  86 + _navigationBar.title.text = @"群二维码名片";
  87 + _navigationBar.title.textColor = [UIColor blackColor];
  88 + _navigationBar.right = nil;
  89 + }
  90 + return _navigationBar;
  91 +}
  92 +- (CNLiveGroupQrCodeView *)groupView {
  93 + if (!_groupView) {
  94 + _groupView = [[CNLiveGroupQrCodeView alloc] initWithFrame:CGRectMake(0, 0, 310, 342)];
  95 + _groupView.center = CGPointMake(self.view.center.x, self.view.center.y-20);
  96 + _groupView.layer.masksToBounds = YES;
  97 + _groupView.layer.cornerRadius = 10;
  98 +// _groupView.group = self.group;
  99 + }
  100 + return _groupView;
  101 +}
  102 +- (UIButton *)save{
  103 + if(!_save){
  104 + _save = [UIButton buttonWithType:UIButtonTypeCustom];
  105 + _save.titleLabel.font = [UIFont systemFontOfSize:16.0];
  106 + _save.backgroundColor = [UIColor whiteColor];
  107 + _save.layer.cornerRadius = 5;
  108 + _save.layer.masksToBounds = YES;
  109 + [_save addTarget:self action:@selector(saveBtnDidClicked:) forControlEvents:UIControlEventTouchUpInside];
  110 + [_save setTitle:@"保存到手机" forState:UIControlStateNormal];
  111 + [_save setTitleColor:[UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0] forState:UIControlStateNormal];
  112 + _save.backgroundColor = [UIColor colorWithRed:234/255.0 green:236/255.0 blue:244/255.0 alpha:1.0];
  113 +
  114 + }
  115 + return _save;
  116 +
  117 +}
  118 +- (UIButton *)share{
  119 + if(!_share){
  120 + _share = [UIButton buttonWithType:UIButtonTypeCustom];
  121 + _share.titleLabel.font = [UIFont systemFontOfSize:16.0];
  122 + _share.backgroundColor = [UIColor whiteColor];
  123 + _share.layer.cornerRadius = 5;
  124 + _share.layer.masksToBounds = YES;
  125 + [_share addTarget:self action:@selector(shareDidClicked:) forControlEvents:UIControlEventTouchUpInside];
  126 + [_share setTitle:@"分享二维码" forState:UIControlStateNormal];
  127 + [_share setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  128 + _share.backgroundColor = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0];
  129 +
  130 + }
  131 + return _share;
  132 +
  133 +}
65 134  
66 135 #pragma mark - 响应方法
67   -- (void)soccerDidClicked:(UIButton *)btn{
  136 +- (void)goBack {
  137 + if (self.presentingViewController != nil) {
  138 + [self dismissViewControllerAnimated:YES completion:nil];
  139 +
  140 + }
  141 + else {
  142 + [self.navigationController popViewControllerAnimated:YES];
  143 + }
  144 +}
  145 +#pragma mark - 保存到手机
  146 +- (void)saveBtnDidClicked:(UIButton *)btn{
  147 + UIImage *image = [self generateImage:self.groupView];
  148 + [QMUITips showLoadingInView:self.view];
  149 + [self saveImage:image];
  150 + [QMUITips hideAllTipsInView:self.view];
  151 +
  152 +}
  153 +
  154 +- (void)saveImage:(UIImage *)image {
  155 + [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
  156 + [PHAssetChangeRequest creationRequestForAssetFromImage:image];
  157 +
  158 + } completionHandler:^(BOOL success, NSError * _Nullable error) {
  159 + if (!success) return ;
  160 + dispatch_async(dispatch_get_main_queue(), ^{
  161 + [QMUITips showSucceed:@"已保存到系统相册" inView:self.view hideAfterDelay:1.5];
  162 + });
  163 + }];
68 164  
69 165 }
70 166  
  167 +#pragma mark - 分享二维码
  168 +- (void)shareDidClicked:(UIButton *)btn{
  169 + UIImage *image = [self generateImage:self.groupView];
  170 + NSArray *imageArray = @[@"sport_china_download"].copy;
  171 + NSArray *titleArray = @[@"保存"].copy;
  172 + __weak typeof(self) weakSelf = self;
  173 +// [CNLiveShareManager showShareViewWithParamForShareTitle:nil ShareUrl:nil ShareDesc:nil ShareImage:image ScreenFull:NO HiddenWjj:NO HiddenQQ:NO HiddenWB:NO HiddenWechat:NO HiddenSafari:YES TopImage:imageArray TopTitles:titleArray PlatformType:CNLiveSharePlatformTypeAll TouchActionBlock:^(NSString *title) {
  174 +//
  175 +// } CompleterBlock:^(CNLiveShareResultType resultType, CNLiveSharePlatformType platformType, NSString *typtString) {
  176 +//
  177 +// }];
  178 +}
  179 +
  180 +// UIView转UIImage
  181 +- (UIImage *)generateImage:(UIView *)view{
  182 + // 1.开启上下文
  183 + UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0.0);
  184 + // 2. 将控制器View的Layer渲染到上下文
  185 + [view.layer renderInContext:UIGraphicsGetCurrentContext()];
  186 + // 3.取出图片
  187 + UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
  188 + // 4.结束上下文
  189 + UIGraphicsEndImageContext();
  190 +
  191 + return newImage;
  192 +}
  193 +
71 194 /**
72 195 * 创建图片
73 196 *
... ...
CNLiveQrCodeModule/Classes/Controller/CNLiveMyQrCodeController.m
... ... @@ -7,23 +7,20 @@
7 7 //
8 8  
9 9 #import "CNLiveMyQrCodeController.h"
10   -#import "QMUIKit.h"
11   -
12 10 #import <Photos/Photos.h>
13 11 #import <Accelerate/Accelerate.h>
14 12  
  13 +#import "QMUIKit.h"
15 14 #import <Masonry/Masonry.h>
16 15 #import <SDWebImage/SDWebImage.h>
17 16  
18   -
19   -#import "CNLiveMyQrCodeView.h"
20 17 #import "CNLiveQrCodeNavigationBar.h"
  18 +#import "CNLiveMyQrCodeView.h"
21 19  
22 20 @interface CNLiveMyQrCodeController ()<CNLiveQrCodeNavigationBarDelegate>
23 21 @property (nonatomic, strong) CNLiveQrCodeNavigationBar *navigationBar;
24   -@property (nonatomic, weak) UIImageView *bgView;
25   -@property (nonatomic, weak) CNLiveMyQrCodeView *qrCodeView;
26   -@property (nonatomic, weak) UIButton *rightBtn;
  22 +@property (nonatomic, strong) UIImageView *bgView;
  23 +@property (nonatomic, strong) CNLiveMyQrCodeView *qrCodeView;
27 24  
28 25 @end
29 26  
... ... @@ -54,20 +51,8 @@ static const CGFloat timeValue = 1.5;
54 51 }
55 52  
56 53 - (void)createSubViews {
57   - UIImageView *bgView = [[UIImageView alloc]initWithFrame:self.view.bounds];
58   - UIImage *image = [self xw_getImageName:@"qr_code_bg" bundleName:@"CNLiveQrCodeModule" targetClass:[CNLiveMyQrCodeController class]];
59   - [bgView sd_setImageWithURL:[NSURL URLWithString:@"User_Head"] placeholderImage:image completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
60   - if(image){
61   -// bgView.image = [image blurImageWithRadius:4];
62   - }
63   - }];
64   - [self.view addSubview:bgView];
65   - self.bgView = bgView;
66   -
67   - CNLiveMyQrCodeView *qrCodeView = [[CNLiveMyQrCodeView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH-2*margin, 420)];
68   - qrCodeView.center = self.view.center;
69   - [self.view addSubview:qrCodeView];
70   - self.qrCodeView = qrCodeView;
  54 + [self.view addSubview:self.bgView];
  55 + [self.view addSubview:self.qrCodeView];
71 56 [self.view addSubview:self.navigationBar];
72 57  
73 58 }
... ... @@ -201,15 +186,35 @@ static const CGFloat timeValue = 1.5;
201 186 }];
202 187 }
203 188  
204   -#pragma mark - 懒加载
  189 +#pragma mark - 代理
205 190 - (void)navigationBar:(CNLiveQrCodeNavigationBar *)navigationBar actionEvents:(NSString *)actionEvents{
206 191 if ([actionEvents isEqualToString:@"1"]) {
207 192 [self goBack];
208 193 }
209 194 }
  195 +#pragma mark - 懒加载
  196 +- (UIImageView *)bgView{
  197 + if(!_bgView){
  198 + _bgView = [[UIImageView alloc]initWithFrame:self.view.bounds];
  199 + UIImage *image = [self xw_getImageName:@"qr_code_bg" bundleName:@"CNLiveQrCodeModule" targetClass:[CNLiveMyQrCodeController class]];
  200 + [_bgView sd_setImageWithURL:[NSURL URLWithString:@"User_Head"] placeholderImage:image completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
  201 + if(image){
  202 + // bgView.image = [image blurImageWithRadius:4];
  203 + }
  204 + }];
  205 + }
  206 + return _bgView;
  207 +}
  208 +- (CNLiveMyQrCodeView *)qrCodeView {
  209 + if (!_qrCodeView) {
  210 + _qrCodeView = [[CNLiveMyQrCodeView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH-2*margin, 420)];
  211 + _qrCodeView.center = self.view.center;
  212 + }
  213 + return _qrCodeView;
  214 +}
210 215 - (CNLiveQrCodeNavigationBar *)navigationBar {
211 216 if (!_navigationBar) {
212   - _navigationBar = [[CNLiveQrCodeNavigationBar alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width, NavigationContentTop)];
  217 + _navigationBar = [[CNLiveQrCodeNavigationBar alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, NavigationContentTop)];
213 218 _navigationBar.delegate = self;
214 219 _navigationBar.title.text = @"我的二维码";
215 220 UIImage *image2 = [self xw_getImageName:@"mine_code_more" bundleName:@"CNLiveQrCodeModule" targetClass:[CNLiveMyQrCodeController class]];
... ...
CNLiveQrCodeModule/Classes/Controller/CNLiveScanQrCodeController.m
... ... @@ -16,7 +16,7 @@
16 16 #import "CNLiveMyQrCodeController.h"
17 17 #import "CNLiveQrCodeNavigationBar.h"
18 18  
19   -//#import "XWScanSuccessController.h"
  19 +#import "CNLiveScanResultController.h"
20 20  
21 21 @interface CNLiveScanQrCodeController ()<CNLiveQrCodeNavigationBarDelegate>{
22 22 SGQRCodeObtain *obtain;
... ... @@ -151,9 +151,10 @@ static const CGFloat timeValue = 1.5;
151 151  
152 152 [obtain establishQRCodeObtainScanWithController:self configure:configure];
153 153 [obtain startRunningWithBefore:^{
154   -// [SVProgressHUD showWithStatus:@"正在加载..."];
  154 + [QMUITips showInfo:@"正在加载..."];
  155 +
155 156 } completion:^{
156   -// [SVProgressHUD dismiss];
  157 + [QMUITips hideAllTips];
157 158 }];
158 159 [obtain setBlockWithQRCodeObtainScanResult:^(SGQRCodeObtain *obtain, NSString *result) {
159 160 __strong typeof(weakSelf) strongSelf = weakSelf;
... ... @@ -228,9 +229,9 @@ static const CGFloat timeValue = 1.5;
228 229 }
229 230 // 不是app的业务
230 231 else{
231   -// XWScanSuccessController *jumpVC = [[XWScanSuccessController alloc] init];
232   -// jumpVC.jump_URL = result;
233   -// [self.navigationController pushViewController:jumpVC animated:YES];
  232 + CNLiveScanResultController *jumpVC = [[CNLiveScanResultController alloc] init];
  233 + jumpVC.jump_URL = result;
  234 + [self.navigationController pushViewController:jumpVC animated:YES];
234 235 }
235 236  
236 237 }
... ... @@ -267,15 +268,16 @@ static const CGFloat timeValue = 1.5;
267 268 return UIStatusBarStyleLightContent;
268 269  
269 270 }
270   -#pragma mark - 懒加载
  271 +#pragma mark - 代理
271 272 - (void)navigationBar:(CNLiveQrCodeNavigationBar *)navigationBar actionEvents:(NSString *)actionEvents{
272 273 if ([actionEvents isEqualToString:@"1"]) {
273 274 [self goBack];
274 275 }
275 276 }
  277 +#pragma mark - 懒加载
276 278 - (CNLiveQrCodeNavigationBar *)navigationBar {
277 279 if (!_navigationBar) {
278   - _navigationBar = [[CNLiveQrCodeNavigationBar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, NavigationContentTop)];
  280 + _navigationBar = [[CNLiveQrCodeNavigationBar alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, NavigationContentTop)];
279 281 _navigationBar.delegate = self;
280 282 _navigationBar.title.text = @"扫一扫";
281 283 [_navigationBar.right setTitle:@"相册" forState:UIControlStateNormal];
... ... @@ -291,7 +293,7 @@ static const CGFloat timeValue = 1.5;
291 293 - (UIButton *)flashlightBtn {
292 294 if (!_flashlightBtn) {
293 295 _flashlightBtn = [UIButton buttonWithType:UIButtonTypeCustom];
294   - CGFloat flashlightBtnW = 60;
  296 + CGFloat flashlightBtnW = 100;
295 297 CGFloat flashlightBtnH = 50;
296 298 CGFloat flashlightBtnX = 0.5 * (self.view.frame.size.width - flashlightBtnW);
297 299 CGFloat flashlightBtnY = 0.55 * self.view.frame.size.height;
... ... @@ -300,7 +302,14 @@ static const CGFloat timeValue = 1.5;
300 302 UIImage *image2 = [self xw_getImageName:@"flashlight_open" bundleName:@"CNLiveQrCodeModule" targetClass:[CNLiveScanQrCodeController class]];
301 303 [_flashlightBtn setImage:image1 forState:UIControlStateNormal];
302 304 [_flashlightBtn setImage:image2 forState:UIControlStateSelected];
  305 + [_flashlightBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  306 + [_flashlightBtn setTitleColor:[UIColor greenColor] forState:UIControlStateSelected];
  307 + [_flashlightBtn setTitle:@"轻触点亮" forState:UIControlStateNormal];
  308 + [_flashlightBtn setTitle:@"轻触关闭" forState:UIControlStateSelected];
  309 + _flashlightBtn.titleLabel.font = [UIFont systemFontOfSize:13];
303 310 [_flashlightBtn addTarget:self action:@selector(flashlightButtonDidClicked:) forControlEvents:UIControlEventTouchUpInside];
  311 + _flashlightBtn.titleEdgeInsets = UIEdgeInsetsMake(_flashlightBtn.imageView.frame.size.height+10, -_flashlightBtn.imageView.frame.size.width, 0, 0);
  312 + _flashlightBtn.imageEdgeInsets = UIEdgeInsetsMake(-_flashlightBtn.titleLabel.bounds.size.height, 0, 10, -_flashlightBtn.titleLabel.bounds.size.width);
304 313 }
305 314 return _flashlightBtn;
306 315  
... ... @@ -325,18 +334,20 @@ static const CGFloat timeValue = 1.5;
325 334 - (UIButton *)codeButton {
326 335 if (!_codeButton) {
327 336 _codeButton = [UIButton buttonWithType:(UIButtonTypeCustom)];
328   - CGFloat flashlightBtnW = 120;
  337 + CGFloat flashlightBtnW = 100;
329 338 CGFloat flashlightBtnH = 50;
330 339 CGFloat flashlightBtnX = 0.5 * (self.view.frame.size.width - flashlightBtnW);
331 340 CGFloat flashlightBtnY = CGRectGetMaxY(self.promptLabel.frame)+15;
332 341 _codeButton.frame = CGRectMake(flashlightBtnX, flashlightBtnY, flashlightBtnW, flashlightBtnH);
333 342 UIImage *image = [self xw_getImageName:@"qr_code_green" bundleName:@"CNLiveQrCodeModule" targetClass:[CNLiveScanQrCodeController class]];
334 343 [_codeButton setImage:image forState:UIControlStateNormal];
335   - [_codeButton setTitle:@" 我的二维码" forState:UIControlStateNormal];
  344 + [_codeButton setTitle:@"我的二维码" forState:UIControlStateNormal];
336 345 _codeButton.titleLabel.font = [UIFont fontWithName:@"PingFang-SC-Regular" size:15.0f];
337 346 [_codeButton setTitleColor:[UIColor colorWithRed:26/255.0 green:161/255.0 blue:45/255.0 alpha:1.0] forState:UIControlStateNormal];
338 347 [_codeButton addTarget:self action:@selector(codeButtonDidClicked:) forControlEvents:UIControlEventTouchUpInside];
339 348 [_codeButton setAdjustsImageWhenHighlighted:NO];
  349 + _codeButton.titleEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 20);
  350 + _codeButton.imageEdgeInsets = UIEdgeInsetsMake(0, 80, 0, -80);
340 351 }
341 352 return _codeButton;
342 353  
... ...
CNLiveQrCodeModule/Classes/Controller/CNLiveScanResultController.h 0 → 100755
  1 +//
  2 +// CNLiveScanResultController.h
  3 +// CNLiveQrCodeModule
  4 +//
  5 +// Created by 153993236@qq.com on 11/12/2019.
  6 +// Copyright (c) 2019 153993236@qq.com. All rights reserved.
  7 +//
  8 +
  9 +#import <UIKit/UIKit.h>
  10 +
  11 +@interface CNLiveScanResultController : UIViewController
  12 +/** 是否返回到Root */
  13 +@property (nonatomic, assign) BOOL isPopToRoot;
  14 +@property (nonatomic, copy) NSString *jump_URL;
  15 +
  16 +@end
... ...
CNLiveQrCodeModule/Classes/Controller/CNLiveScanResultController.m 0 → 100755
  1 +//
  2 +// CNLiveScanResultController.m
  3 +// CNLiveQrCodeModule
  4 +//
  5 +// Created by 153993236@qq.com on 11/12/2019.
  6 +// Copyright (c) 2019 153993236@qq.com. All rights reserved.
  7 +//
  8 +
  9 +#import "CNLiveScanResultController.h"
  10 +#import "QMUIKit.h"
  11 +
  12 +#import "CNLiveQrCodeNavigationBar.h"
  13 +#import "CNLiveWebView.h"
  14 +
  15 +@interface CNLiveScanResultController () <CNLiveQrCodeNavigationBarDelegate, CNLiveWebViewDelegate>
  16 +@property (nonatomic, strong) CNLiveQrCodeNavigationBar *navigationBar;
  17 +@property (nonatomic, strong) CNLiveWebView *webView;
  18 +
  19 +@end
  20 +
  21 +@implementation CNLiveScanResultController
  22 +#pragma mark - 生命周期
  23 +- (void)viewWillAppear:(BOOL)animated{
  24 + [super viewWillAppear:animated];
  25 + self.navigationController.navigationBarHidden = YES;
  26 +}
  27 +
  28 +- (void)viewDidLoad {
  29 + [super viewDidLoad];
  30 + // Do any additional setup after loading the view.
  31 + self.view.backgroundColor = [UIColor whiteColor];
  32 + [self setupSubView];
  33 +
  34 + if ([self.jump_URL hasPrefix:@"http://"]||[self.jump_URL hasPrefix:@"https://"]) {
  35 + [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.jump_URL]]];
  36 +
  37 + } else {
  38 + [_webView loadHTMLString:[self html:self.jump_URL]];
  39 + }
  40 +}
  41 +
  42 +- (NSString *)html:(NSString *)url{
  43 + return [NSString stringWithFormat:@"<div style=\"font-size:40px\">%@</div>",url];
  44 +}
  45 +
  46 +- (void)setupSubView {
  47 + [self.view addSubview:self.navigationBar];
  48 + [self.view addSubview:self.webView];
  49 +}
  50 +
  51 +- (void)webView:(CNLiveWebView *)webView didFinishLoadWithURL:(NSURL *)url {
  52 + NSLog(@"didFinishLoad");
  53 + if(webView.navigationItemTitle.length != 0){
  54 + self.navigationBar.title.text = webView.navigationItemTitle;
  55 + }else{
  56 + self.navigationBar.title.text = @"识别结果";
  57 +
  58 + }
  59 +
  60 +}
  61 +#pragma mark - 代理
  62 +- (void)navigationBar:(CNLiveQrCodeNavigationBar *)navigationBar actionEvents:(NSString *)actionEvents{
  63 + if ([actionEvents isEqualToString:@"1"]) {
  64 +// [self goBack];
  65 + }
  66 +}
  67 +
  68 +- (void)webView:(CNLiveWebView *)webView didFailLoadWithError:(NSError *)error{
  69 +
  70 +}
  71 +
  72 +#pragma mark - 懒加载
  73 +- (CNLiveQrCodeNavigationBar *)navigationBar {
  74 + if (!_navigationBar) {
  75 + _navigationBar = [[CNLiveQrCodeNavigationBar alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, NavigationContentTop)];
  76 + _navigationBar.delegate = self;
  77 + _navigationBar.title.textColor = [UIColor blackColor];
  78 + _navigationBar.delegate = self;
  79 +
  80 + UIImage *image = [self xw_getImageName:@"code_back_black_b" bundleName:@"CNLiveQrCodeModule" targetClass:[CNLiveScanResultController class]];
  81 + [_navigationBar.left setImage:[image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forState:UIControlStateNormal];
  82 + _navigationBar.right = nil;
  83 +
  84 + }
  85 + return _navigationBar;
  86 +}
  87 +
  88 +- (CNLiveWebView *)webView {
  89 + if (!_webView) {
  90 + _webView = [CNLiveWebView webViewWithFrame:CGRectMake(0, NavigationContentTop, SCREEN_WIDTH, SCREEN_HEIGHT-NavigationContentTop)];
  91 + _webView.isNavigationBarOrTranslucent = NO;
  92 + _webView.delegate = self;
  93 + }
  94 + return _webView;
  95 +}
  96 +
  97 +/**
  98 + * 创建图片
  99 + *
  100 + * @param imageName 图片名字
  101 + * @param bundleName 图片所在的bundle名字
  102 + * @param targetClass 类和bundle的同级目录
  103 + * @return 返回UIImage
  104 + */
  105 +- (UIImage *)xw_getImageName:(NSString *)imageName bundleName:(NSString *)bundleName targetClass:(Class)targetClass{
  106 + NSBundle *bundle = [NSBundle bundleForClass:targetClass];
  107 + NSURL *url = [bundle URLForResource:bundleName withExtension:@"bundle"];
  108 + NSBundle *targetBundle = [NSBundle bundleWithURL:url];
  109 + UIImage *image = [UIImage imageNamed:imageName inBundle:targetBundle compatibleWithTraitCollection:nil];
  110 + return image?image:[UIImage imageNamed:imageName inBundle:[NSBundle mainBundle] compatibleWithTraitCollection:nil];
  111 +}
  112 +
  113 +@end
... ...
CNLiveQrCodeModule/Classes/View/CNLiveGroupQrCodeView.m
... ... @@ -10,278 +10,127 @@
10 10 #import <Masonry/Masonry.h>
11 11 #import <SDWebImage/SDWebImage.h>
12 12 #import "QMUIKit.h"
  13 +#import "SGQRCode.h"//二维码库
13 14  
14   -@interface CNLiveGroupQrCodeView ()
15   -@property (nonatomic, strong) UIImageView *bgView;
16   -@property (nonatomic, strong) UIButton *witness;
  15 +//#import "SGQRCodeGenerateManager.h"
  16 +//#import "CNLiveGroupAvatorManager.h"
17 17  
18   -@property (nonatomic, strong) UIImageView *header;
19   -@property (nonatomic, strong) UILabel *name;
20   -@property (nonatomic, strong) UILabel *certification;
21   -@property (nonatomic, strong) UILabel *address;
22   -@property (nonatomic, strong) UIButton *sign;
  18 +@interface CNLiveGroupQrCodeView()
  19 +@property (nonatomic, strong) UIImageView *groupHead;
  20 +@property (nonatomic, strong) UILabel *groupName;
  21 +@property (nonatomic, strong) UIImageView *qrcode;
  22 +@property (nonatomic, strong) UILabel *desc;
23 23  
24 24 @end
25   -
26 25 @implementation CNLiveGroupQrCodeView
27   -static const NSInteger margin = 20;
  26 +static const NSInteger margin = 15;
28 27  
29   -- (instancetype)initWithFrame:(CGRect)frame{
30   - self = [super initWithFrame:frame];
31   - if(self){
32   - self.userInteractionEnabled = YES;
33   - self.backgroundColor = [UIColor colorWithRed:244.0/255.0 green:244.0/255.0 blue:244.0/255.0 alpha:1.0];
34   - [self createSubViews];
  28 +- (instancetype)initWithFrame:(CGRect)frame {
  29 + if (self = [super initWithFrame:frame]) {
  30 + self.backgroundColor = [UIColor whiteColor];
  31 + [self createUI];
35 32 }
36 33 return self;
37 34 }
38   -// 实现方法
39   -- (void)userInfoUpdateNotification:(NSNotification *)noti{
40   - //使用userInfo处理消息
41   -// NSDictionary *dic = [noti userInfo];
42   -// XWUserInfoDataType type = [[dic objectForKey:@"type"] integerValue];
43   -// if(type == XWUserInfoDataTypeHead){
44   -// UIImage *info = [dic objectForKey:@"info"];
45   -// _header.image = info;
46   -//
47   -// }else if(type == XWUserInfoDataTypeNickname){
48   -// NSString *info = [dic objectForKey:@"info"];
49   -// _name.attributedText = [self createAttributedImageName:@"mine_code" string:info isFront:NO];
50   -//
51   -// }else if(type == XWUserInfoDataTypeAddress){
52   -// NSString *info = [dic objectForKey:@"info"];
53   -// _address.attributedText = [self createAttributedImageName:@"mine_location" string:info isFront:YES];
54   -//
55   -// }
56   -}
57   -
58   -- (void)dealloc {
59   - NSLog(@"CNLiveGroupQrCodeView -- dealloc");
60   -// [XWUserInfoNotification removeObserver:self];
61   -
62   -}
63   -
64   -- (void)createSubViews {
65   - [self addSubview:self.bgView];
66   - [self addSubview:self.witness];
67   -
68   - [self addSubview:self.header];
69   - [self addSubview:self.name];
70   - [self addSubview:self.certification];
71   - [self addSubview:self.address];
72   - [self addSubview:self.sign];
73 35  
74   -}
75   -
76   -- (void)layoutSubviews{
77   - [super layoutSubviews];
78   - [_witness mas_remakeConstraints:^(MASConstraintMaker *make) {
79   - make.left.equalTo(self.mas_left).with.offset(1.5*margin);
80   - make.right.equalTo(self.mas_right).with.offset(-1.5*margin);
81   - make.width.height.offset(60);
82   - make.bottom.equalTo(self.mas_bottom).with.offset(-0.5*margin);
83   -
  36 +#pragma mark - UI
  37 +- (void)createUI{
  38 + [self addSubview:self.groupHead];
  39 + [self.groupHead mas_makeConstraints:^(MASConstraintMaker *make) {
  40 + make.left.mas_equalTo(self).mas_offset(margin);
  41 + make.top.mas_equalTo(self).mas_offset(margin);
  42 + make.width.mas_equalTo(36);
  43 + make.height.mas_equalTo(36);
84 44 }];
85 45  
86   - [_bgView mas_remakeConstraints:^(MASConstraintMaker *make) {
87   - make.left.equalTo(self.mas_left).with.offset(0);
88   - make.right.equalTo(self.mas_right).with.offset(-0);
89   - make.top.equalTo(self.mas_top).with.offset(0);
90   - make.bottom.equalTo(self.witness.mas_centerY).with.offset(0.5*margin);
91   -
92   - }];
93   -
94   - [_header mas_remakeConstraints:^(MASConstraintMaker *make) {
95   - make.left.equalTo(self.mas_left).with.offset(margin);
96   - make.centerY.equalTo(self.bgView.mas_centerY).with.offset(0);
97   - make.width.height.offset(60);
  46 + [self addSubview:self.groupName];
  47 + [self.groupName mas_makeConstraints:^(MASConstraintMaker *make) {
  48 + make.left.mas_equalTo(self.groupHead.mas_right).mas_offset(margin);
  49 + make.right.mas_equalTo(self.mas_right).mas_offset(-margin);
  50 + make.top.mas_equalTo(self.groupHead.mas_top);
  51 + make.height.mas_equalTo(self.groupHead.mas_height);
98 52  
99 53 }];
100 54  
101   - [_certification mas_remakeConstraints:^(MASConstraintMaker *make) {
102   - make.centerY.equalTo(self.header.mas_centerY);
103   - make.left.equalTo(self.header.mas_right).with.offset(margin/2.0);
104   - make.height.offset(35);
105   -
106   - }];
107   -
108   - [_name mas_remakeConstraints:^(MASConstraintMaker *make) {
109   - make.bottom.equalTo(self.certification.mas_top);
110   - make.left.equalTo(self.certification.mas_left);
111   - make.right.equalTo(self.bgView.mas_right).with.offset(-margin);
112   - make.height.equalTo(self.certification.mas_height);
113   -
  55 + [self addSubview:self.qrcode];
  56 + [self.qrcode mas_makeConstraints:^(MASConstraintMaker *make) {
  57 + make.centerX.mas_equalTo(self.mas_centerX);
  58 + make.top.mas_equalTo(self.groupName.mas_bottom).mas_offset(margin);
  59 + make.width.mas_equalTo(220.0);
  60 + make.height.mas_equalTo(220.0);
114 61 }];
115 62  
116   - [_address mas_remakeConstraints:^(MASConstraintMaker *make) {
117   - make.top.equalTo(self.certification.mas_bottom);
118   - make.left.equalTo(self.name.mas_left);
119   - make.right.equalTo(self.name.mas_right);
120   - make.height.equalTo(self.name.mas_height);
121   -
122   - }];
  63 + [self addSubview:self.desc];
  64 + [self.desc mas_makeConstraints:^(MASConstraintMaker *make) {
  65 + make.left.mas_equalTo(self.mas_left).mas_offset(margin);
  66 + make.right.mas_equalTo(self.mas_right).mas_offset(-margin);
  67 + make.top.mas_equalTo(self.qrcode.mas_bottom).mas_offset(0);
  68 + make.bottom.mas_equalTo(self.mas_bottom).mas_offset(-0);
123 69  
124   - [_sign mas_remakeConstraints:^(MASConstraintMaker *make) {
125   - make.right.equalTo(self.mas_right).with.offset(0);
126   - make.centerY.equalTo(self.header.mas_centerY).with.offset(0);
127   - make.width.mas_equalTo(105);
128   - make.height.mas_equalTo(32);
129   -
130   - }];
  70 + }];
131 71 }
132 72 /*
133   - // Only override drawRect: if you perform custom drawing.
134   - // An empty implementation adversely affects performance during animation.
135   - - (void)drawRect:(CGRect)rect {
136   - // Drawing code
137   - }
138   - */
139   -#pragma mark - Private Methods
140   -- (NSMutableAttributedString *)createAttributedImageName:(NSString *)imageName string:(NSString *)string isFront:(BOOL)isFront{
141   - if(isFront){
142   - string = [NSString stringWithFormat:@" %@",string];
143   - }
144   - // 1.创建一个富文本
145   - NSMutableAttributedString *attri = [[NSMutableAttributedString alloc] initWithString:string];
146   - // 修改富文本中的不同文字的样式
147   -// [attri addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, string.length)];
148   -// [attri addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:14] range:NSMakeRange(0, string.length)];
149   - // 2.添加表情图片
150   - NSTextAttachment *attch = [[NSTextAttachment alloc] init];
151   - // 表情图片
152   - UIImage *xw_image = [self xw_getImageName:imageName bundleName:@"CNLiveQrCodeModule" targetClass:[CNLiveGroupQrCodeView class]];
153   - attch.image = xw_image;
154   - if(isFront){
155   - // 设置图片大小
156   - attch.bounds = CGRectMake(0, -1.5, 10, 12);
157   - // 创建带有图片的富文本
158   - NSAttributedString *str = [NSAttributedString attributedStringWithAttachment:attch];
159   - [attri insertAttributedString:str atIndex:0];// 插入某个位置
160   - }else{
161   - // 设置图片大小
162   - attch.bounds = CGRectMake(10, -2, 15, 15);
163   - // 创建带有图片的富文本
164   - NSAttributedString *str = [NSAttributedString attributedStringWithAttachment:attch];
165   - [attri insertAttributedString:str atIndex:string.length];// 插入某个位置
166   -
167   - }
168   - return attri;
169   -
170   -}
171   -- (NSMutableAttributedString *)createAttributedImages:(NSArray *)images {
172   - // 1.创建一个富文本
173   - NSMutableAttributedString *attri = [[NSMutableAttributedString alloc] initWithString:@""];
174   - for(NSString *image in images){
175   - // 2.添加表情图片
176   - NSTextAttachment *attch = [[NSTextAttachment alloc] init];
177   - // 表情图片
178   - UIImage *xw_image = [self xw_getImageName:image bundleName:@"CNLiveQrCodeModule" targetClass:[CNLiveGroupQrCodeView class]];
179   - attch.image = xw_image;
180   - // 创建带有图片的富文本
181   - NSAttributedString *str = [NSAttributedString attributedStringWithAttachment:attch];
182   - NSAttributedString *space = [[NSAttributedString alloc]initWithString:@" "];
  73 +// Only override drawRect: if you perform custom drawing.
  74 +// An empty implementation adversely affects performance during animation.
  75 +- (void)drawRect:(CGRect)rect {
  76 + // Drawing code
  77 +}
  78 +*/
  79 +
  80 +#pragma mark - Setter
  81 +//- (void)setGroup:(IMAGroup *)group{
  82 +// _group = group;
  83 +// if(group.avatorIcon){
  84 +// _groupHead.image = group.avatorIcon;
  85 +// }else{
  86 +// [_groupHead setImageWithGroupId:group.groupInfo.groupId];
  87 +//
  88 +// }
  89 +// _groupName.text = group.groupInfo.groupName;
  90 +// _qrcode.image = [SGQRCodeObtain generateWithLogoQRCodeData:group.groupInfo.groupId logoImageName:nil logoScaleToSuperView:0.2];
  91 +//
  92 +//}
183 93  
184   - [attri insertAttributedString:space atIndex:0];
185   - [attri insertAttributedString:str atIndex:0];// 插入某个位置
  94 +#pragma mark - Getter
  95 +- (UIImageView *)groupHead {
  96 + if (!_groupHead) {
  97 + _groupHead = [[UIImageView alloc] init];
  98 + _groupHead.backgroundColor = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0];
186 99  
187 100 }
188   - return attri;
189   -
  101 + return _groupHead;
190 102 }
191 103  
192   -#pragma mark - 懒加载
193   -- (UIButton *)witness {
194   - if (!_witness) {
195   - _witness = [UIButton buttonWithType:UIButtonTypeCustom];
196   - UIImage *xw_image = [self xw_getImageName:@"mine_observer" bundleName:@"CNLiveQrCodeModule" targetClass:[CNLiveGroupQrCodeView class]];
197   - _witness.imageView.contentMode = UIViewContentModeScaleAspectFit;
198   - [_witness setImage:xw_image forState:UIControlStateNormal];
199   - _witness.adjustsImageWhenHighlighted = NO;
200   - [_witness addTarget:self action:@selector(witnessDidClicked:) forControlEvents:UIControlEventTouchUpInside];
  104 +- (UILabel *)groupName {
  105 + if (!_groupName) {
  106 + _groupName = [[UILabel alloc] init];
  107 + _groupName.textColor = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0];
  108 + _groupName.font = UIFontMake(15);
  109 + _groupName.numberOfLines = 1;
  110 + _groupName.text = @"张晓文";
201 111 }
202   - return _witness;
203   -}
204   -- (UIImageView *)bgView {
205   - if (!_bgView) {
206   - _bgView = [[UIImageView alloc] init];
207   - _bgView.userInteractionEnabled = YES;
208   - UIImage *xw_image = [self xw_getImageName:@"mine_bg" bundleName:@"CNLiveQrCodeModule" targetClass:[CNLiveGroupQrCodeView class]];
209   - _bgView.image = xw_image;
210   - }
211   - return _bgView;
212   -}
213   -- (UIImageView *)header {
214   - if (!_header) {
215   - _header = [[UIImageView alloc] init];
216   - _header.userInteractionEnabled = YES;
217   - _header.layer.masksToBounds = YES;
218   - _header.layer.cornerRadius = 30;
219   - UIImage *xw_image = [self xw_getImageName:@"default_avatar_y" bundleName:@"CNLiveQrCodeModule" targetClass:[CNLiveGroupQrCodeView class]];
220   - [_header sd_setImageWithURL:[NSURL URLWithString:@"头像"] placeholderImage:xw_image];
221   - UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(headerTapDidClicked:)];
222   - [_header addGestureRecognizer:tap];
223   - }
224   - return _header;
  112 + return _groupName;
225 113 }
226 114  
227   -- (UILabel *)name {
228   - if (!_name) {
229   - _name = [[UILabel alloc] init];
230   - _name.userInteractionEnabled = YES;
231   - _name.numberOfLines = 1;
232   - _name.textColor = [UIColor whiteColor];
233   - _name.font = [UIFont systemFontOfSize:16];
234   - _name.attributedText = [self createAttributedImageName:@"mine_code" string:@"张晓文" isFront:NO];
235   - UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(nameTapDidClicked:)];
236   - [_name addGestureRecognizer:tap];
237   -
238   - }
239   - return _name;
240   -}
241   -- (UILabel *)certification {
242   - if (!_certification) {
243   - _certification = [[UILabel alloc] init];
244   - _certification.numberOfLines = 1;
245   - _certification.textColor = [UIColor whiteColor];
246   - _certification.font = [UIFont systemFontOfSize:16];
247   - _certification.attributedText = [self createAttributedImages:@[@"mine_overbadge",@"mine_common", @"mine_wjj_certification"]];
248   - }
249   - return _certification;
250   -}
251   -- (UILabel *)address {
252   - if (!_address) {
253   - _address = [[UILabel alloc] init];
254   - _address.numberOfLines = 1;
255   - _address.textColor = [UIColor colorWithRed:140/255.0 green:140/255.0 blue:142/255.0 alpha:1.0];
256   - _address.font = [UIFont systemFontOfSize:13];
257   - _address.attributedText = [self createAttributedImageName:@"mine_location" string:@"北京海淀区花园桥" isFront:YES];
  115 +- (UIImageView *)qrcode {
  116 + if (!_qrcode) {
  117 + _qrcode = [[UIImageView alloc] init];
  118 + _qrcode.backgroundColor = [UIColor greenColor];
  119 + _qrcode.image = [SGQRCodeObtain generateQRCodeWithData:@"群组id" size:220.0 logoImage:nil ratio:0.2];
258 120 }
259   - return _address;
  121 + return _qrcode;
260 122 }
261   -- (UIButton *)sign {
262   - if (!_sign) {
263   - _sign = [UIButton buttonWithType:UIButtonTypeCustom];
264   - _sign.frame = CGRectMake(0, 0, 105, 32);
265   - _sign.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.2];
266   - [_sign setTitle:@"签到赚积分" forState:UIControlStateNormal];
267   - _sign.titleLabel.font = [UIFont systemFontOfSize:13.0];
268   - [_sign setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
269   - UIImage *xw_image = [self xw_getImageName:@"sign_in_soccer" bundleName:@"CNLiveQrCodeModule" targetClass:[CNLiveGroupQrCodeView class]];
270   - [_sign setImage:xw_image forState:UIControlStateNormal];
271   - [_sign addTarget:self action:@selector(signDidClicked:) forControlEvents:UIControlEventTouchUpInside];
272   - UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:_sign.layer.bounds byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerTopLeft cornerRadii:CGSizeMake(16, 16)];
273   - CAShapeLayer *maskLayer = [CAShapeLayer layer];
274   - maskLayer.frame = _sign.bounds;
275   - maskLayer.path = maskPath.CGPath;
276   - _sign.layer.mask = maskLayer;
277   - }
278   - return _sign;
279   -}
280   -
281   -#pragma mark - 响应方法
282   -- (void)headerTapDidClicked:(UITapGestureRecognizer *)tap{
283 123  
284   -
  124 +- (UILabel *)desc {
  125 + if (!_desc) {
  126 + _desc = [[UILabel alloc] init];
  127 + _desc.textColor = [UIColor colorWithRed:153/255.0 green:153/255.0 blue:153/255.0 alpha:1.0];
  128 + _desc.font = UIFontMake(15);
  129 + _desc.numberOfLines = 1;
  130 + _desc.text = @"用“网家家”扫描二维码,加入该群";
  131 + _desc.textAlignment = NSTextAlignmentCenter;
  132 + }
  133 + return _desc;
285 134 }
286 135  
287 136 /**
... ...
CNLiveQrCodeModule/Classes/View/CNLiveQrCodeNavigationBar.h
... ... @@ -21,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN
21 21 @property (nonatomic, strong) UIView *navView;
22 22 @property (nonatomic, strong) UIButton *left;
23 23 @property (nonatomic, strong) UILabel *title;
24   -@property (nonatomic, strong) UIButton *right;
  24 +@property (nonatomic, strong, nullable) UIButton *right;
25 25  
26 26 @end
27 27  
... ...
CNLiveQrCodeModule/Classes/View/CNLiveQrCodeNavigationBar.m
... ... @@ -57,6 +57,7 @@ static const NSInteger margin = 15;
57 57 - (UIButton *)left {
58 58 if (!_left) {
59 59 _left= [UIButton buttonWithType:UIButtonTypeSystem];
  60 + _left.adjustsImageWhenHighlighted = NO;
60 61 _left.frame = CGRectMake(margin, StatusBarHeight, NavigationBarHeight, NavigationBarHeight);
61 62 UIImage *image = [self xw_getImageName:@"mine_back_white_b" bundleName:@"CNLiveQrCodeModule" targetClass:[CNLiveQrCodeNavigationBar class]];
62 63 [_left setImage:[image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forState:UIControlStateNormal];
... ...
CNLiveQrCodeModule/Classes/View/CNLiveWebView.h 0 → 100755
  1 +//
  2 +// CNLiveWebView.h
  3 +// CNLiveQrCodeModule
  4 +//
  5 +// Created by 153993236@qq.com on 11/12/2019.
  6 +// Copyright (c) 2019 153993236@qq.com. All rights reserved.
  7 +//
  8 +// CNLiveWebView 使用注意点:
  9 +// 如果 self.navigationController.navigationBar.translucent = NO;或者导航栏不存在; 那么 XWWebView 的 isNavigationBarOrTranslucent属性 必须设置 NO)
  10 +
  11 +#import <UIKit/UIKit.h>
  12 +@class CNLiveWebView;
  13 +
  14 +@protocol CNLiveWebViewDelegate <NSObject>
  15 +@optional
  16 +/** 页面开始加载时调用 */
  17 +- (void)webViewDidStartLoad:(CNLiveWebView *)webView;
  18 +/** 内容开始返回时调用 */
  19 +- (void)webView:(CNLiveWebView *)webView didCommitWithURL:(NSURL *)url;
  20 +/** 页面加载失败时调用 */
  21 +- (void)webView:(CNLiveWebView *)webView didFinishLoadWithURL:(NSURL *)url;
  22 +/** 页面加载完成之后调用 */
  23 +- (void)webView:(CNLiveWebView *)webView didFailLoadWithError:(NSError *)error;
  24 +@end
  25 +
  26 +@interface CNLiveWebView : UIView
  27 +/** XWDelegate */
  28 +@property (nonatomic, weak) id<CNLiveWebViewDelegate> delegate;
  29 +/** 进度条颜色(默认蓝色) */
  30 +@property (nonatomic, strong) UIColor *progressViewColor;
  31 +/** 导航栏标题 */
  32 +@property (nonatomic, copy) NSString *navigationItemTitle;
  33 +/** 导航栏存在且有穿透效果(默认导航栏存在且有穿透效果) */
  34 +@property (nonatomic, assign) BOOL isNavigationBarOrTranslucent;
  35 +
  36 +/** 类方法创建 XWWebView */
  37 ++ (instancetype)webViewWithFrame:(CGRect)frame;
  38 +/** 加载 web */
  39 +- (void)loadRequest:(NSURLRequest *)request;
  40 +/** 加载 HTML */
  41 +- (void)loadHTMLString:(NSString *)HTMLString;
  42 +/** 刷新数据 */
  43 +- (void)reloadData;
  44 +
  45 +@end
... ...
CNLiveQrCodeModule/Classes/View/CNLiveWebView.m 0 → 100755
  1 +//
  2 +// CNLiveWebView.m
  3 +// CNLiveQrCodeModule
  4 +//
  5 +// Created by 153993236@qq.com on 11/12/2019.
  6 +// Copyright (c) 2019 153993236@qq.com. All rights reserved.
  7 +//
  8 +
  9 +#import "CNLiveWebView.h"
  10 +#import <WebKit/WebKit.h>
  11 +#import "QMUIKit.h"
  12 +
  13 +@interface CNLiveWebView () <WKNavigationDelegate, WKUIDelegate>
  14 +// WKWebView
  15 +@property (nonatomic, strong) WKWebView *wkWebView;
  16 +// 进度条
  17 +@property (nonatomic, strong) UIProgressView *progressView;
  18 +
  19 +@end
  20 +
  21 +@implementation CNLiveWebView
  22 +
  23 +static CGFloat const progressViewHeight = 2;
  24 +
  25 +- (instancetype)initWithFrame:(CGRect)frame {
  26 + if (self = [super initWithFrame:frame]) {
  27 + [self addSubview:self.wkWebView];
  28 + [self addSubview:self.progressView];
  29 + }
  30 + return self;
  31 +}
  32 +
  33 ++ (instancetype)webViewWithFrame:(CGRect)frame {
  34 + return [[self alloc] initWithFrame:frame];
  35 +}
  36 +
  37 +- (WKWebView *)wkWebView {
  38 + if (!_wkWebView) {
  39 + _wkWebView = [[WKWebView alloc] initWithFrame:self.bounds];
  40 + _wkWebView.navigationDelegate = self;
  41 + _wkWebView.UIDelegate = self;
  42 + // KVO
  43 + [self.wkWebView addObserver:self forKeyPath:NSStringFromSelector(@selector(estimatedProgress)) options:0 context:nil];
  44 + }
  45 + return _wkWebView;
  46 +}
  47 +
  48 +- (UIProgressView *)progressView {
  49 + if (!_progressView) {
  50 + _progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
  51 + _progressView.trackTintColor = [UIColor clearColor];
  52 + // 高度默认有导航栏且有穿透效果
  53 + _progressView.frame = CGRectMake(0, NavigationContentTop, self.frame.size.width, progressViewHeight);
  54 + // 设置进度条颜色
  55 + _progressView.tintColor = [UIColor greenColor];
  56 + }
  57 + return _progressView;
  58 +}
  59 +
  60 +- (void)setProgressViewColor:(UIColor *)progressViewColor {
  61 + _progressViewColor = progressViewColor;
  62 +
  63 + if (progressViewColor) {
  64 + _progressView.tintColor = progressViewColor;
  65 + }
  66 +}
  67 +
  68 +- (void)setIsNavigationBarOrTranslucent:(BOOL)isNavigationBarOrTranslucent {
  69 + _isNavigationBarOrTranslucent = isNavigationBarOrTranslucent;
  70 +
  71 + if (isNavigationBarOrTranslucent == YES) { // 导航栏存在且有穿透效果
  72 + _progressView.frame = CGRectMake(0, NavigationContentTop, self.frame.size.width, progressViewHeight);
  73 + } else { // 导航栏不存在或者没有有穿透效果
  74 + _progressView.frame = CGRectMake(0, 0, self.frame.size.width, progressViewHeight);
  75 + }
  76 +}
  77 +/// KVO
  78 +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
  79 + if ([keyPath isEqualToString:NSStringFromSelector(@selector(estimatedProgress))] && object == self.wkWebView) {
  80 + self.progressView.alpha = 1.0;
  81 + BOOL animated = self.wkWebView.estimatedProgress > self.progressView.progress;
  82 + [self.progressView setProgress:self.wkWebView.estimatedProgress animated:animated];
  83 + if(self.wkWebView.estimatedProgress >= 0.97) {
  84 + [UIView animateWithDuration:0.1 delay:0.3 options:UIViewAnimationOptionCurveEaseOut animations:^{
  85 + self.progressView.alpha = 0.0;
  86 + } completion:^(BOOL finished) {
  87 + [self.progressView setProgress:0.0 animated:NO];
  88 + }];
  89 + }
  90 + } else {
  91 + [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
  92 + }
  93 +}
  94 +
  95 +#pragma mark - 加载的状态回调(WKNavigationDelegate)
  96 +/// 页面开始加载时调用
  97 +- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
  98 + if (self.delegate && [self.delegate respondsToSelector:@selector(webViewDidStartLoad:)]) {
  99 + [self.delegate webViewDidStartLoad:self];
  100 + }
  101 +}
  102 +/// 当内容开始返回时调用
  103 +- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation {
  104 + if (self.delegate && [self.delegate respondsToSelector:@selector(webView:didCommitWithURL:)]) {
  105 + [self.delegate webView:self didCommitWithURL:self.wkWebView.URL];
  106 + }
  107 +
  108 + self.navigationItemTitle = self.wkWebView.title;
  109 +}
  110 +/// 页面加载完成之后调用
  111 +- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
  112 + self.navigationItemTitle = self.wkWebView.title;
  113 + if (self.delegate && [self.delegate respondsToSelector:@selector(webView:didFinishLoadWithURL:)]) {
  114 + [self.delegate webView:self didFinishLoadWithURL:self.wkWebView.URL];
  115 + }
  116 +
  117 + self.progressView.alpha = 0.0;
  118 +}
  119 +/// 页面加载失败时调用
  120 +- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error {
  121 + if (self.delegate && [self.delegate respondsToSelector:@selector(webView:didFailLoadWithError:)]) {
  122 + [self.delegate webView:self didFailLoadWithError:error];
  123 + }
  124 +
  125 + self.progressView.alpha = 0.0;
  126 +}
  127 +/// 加载 web
  128 +- (void)loadRequest:(NSURLRequest *)request {
  129 + [self.wkWebView loadRequest:request];
  130 +}
  131 +/// 加载 HTML
  132 +- (void)loadHTMLString:(NSString *)HTMLString {
  133 + [self.wkWebView loadHTMLString:HTMLString baseURL:nil];
  134 +}
  135 +/// 刷新数据
  136 +- (void)reloadData {
  137 + [self.wkWebView reload];
  138 +}
  139 +/// dealloc
  140 +- (void)dealloc {
  141 + [self.wkWebView removeObserver:self forKeyPath:NSStringFromSelector(@selector(estimatedProgress))];
  142 +}
  143 +
  144 +
  145 +@end
... ...
Example/CNLiveQrCodeModule/CNLIVEAppDelegate.m
... ... @@ -9,6 +9,8 @@
9 9 #import "CNLIVEAppDelegate.h"
10 10 #import "CNLiveMyQrCodeController.h"
11 11 #import "CNLiveScanQrCodeController.h"
  12 +#import "CNLiveGroupQrCodeController.h"
  13 +#import "CNLiveScanResultController.h"
12 14  
13 15 @implementation CNLIVEAppDelegate
14 16  
... ... @@ -18,8 +20,8 @@
18 20  
19 21 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
20 22  
21   - CNLiveScanQrCodeController *vc = [[CNLiveScanQrCodeController alloc] init];
22   -
  23 + CNLiveScanResultController *vc = [[CNLiveScanResultController alloc] init];
  24 + vc.jump_URL = @"http://www.baidu.com";
23 25 UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:vc];
24 26  
25 27 self.window.rootViewController = nav;//设置根视图控制器
... ...
Example/CNLiveQrCodeModule/CNLiveQrCodeModule-Info.plist
... ... @@ -2,14 +2,11 @@
2 2 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 3 <plist version="1.0">
4 4 <dict>
5   - <key>NSCameraUsageDescription</key>
6   - <string>App需要您的同意,才能访问相机</string>
7   - <key>NSMicrophoneUsageDescription</key>
8   - <string>App需要您的同意,才能访问麦克风</string>
9   - <key>NSPhotoLibraryAddUsageDescription</key>
10   - <string>App需要您的同意,才能访问相册</string>
11   - <key>NSPhotoLibraryUsageDescription</key>
12   - <string>App需要您的同意,才能访问相册</string>
  5 + <key>NSAppTransportSecurity</key>
  6 + <dict>
  7 + <key>NSAllowsArbitraryLoads</key>
  8 + <true/>
  9 + </dict>
13 10 <key>CFBundleDevelopmentRegion</key>
14 11 <string>en</string>
15 12 <key>CFBundleDisplayName</key>
... ... @@ -32,6 +29,14 @@
32 29 <string>1.0</string>
33 30 <key>LSRequiresIPhoneOS</key>
34 31 <true/>
  32 + <key>NSCameraUsageDescription</key>
  33 + <string>App需要您的同意,才能访问相机</string>
  34 + <key>NSMicrophoneUsageDescription</key>
  35 + <string>App需要您的同意,才能访问麦克风</string>
  36 + <key>NSPhotoLibraryAddUsageDescription</key>
  37 + <string>App需要您的同意,才能访问相册</string>
  38 + <key>NSPhotoLibraryUsageDescription</key>
  39 + <string>App需要您的同意,才能访问相册</string>
35 40 <key>UILaunchStoryboardName</key>
36 41 <string>LaunchScreen</string>
37 42 <key>UIMainStoryboardFile</key>
... ... @@ -43,8 +48,6 @@
43 48 <key>UISupportedInterfaceOrientations</key>
44 49 <array>
45 50 <string>UIInterfaceOrientationPortrait</string>
46   - <string>UIInterfaceOrientationLandscapeLeft</string>
47   - <string>UIInterfaceOrientationLandscapeRight</string>
48 51 </array>
49 52 <key>UISupportedInterfaceOrientations~ipad</key>
50 53 <array>
... ...