From 1f2107919dc9156f34f35b5c1ed7d9783d76cdac Mon Sep 17 00:00:00 2001 From: Robin <1933549736@qq.com> Date: Wed, 9 Mar 2016 14:23:42 +0800 Subject: [PATCH 1/4] fix some deprecated methods about SVProgressHUD --- TSWeChat/General/TSProgressHUD.swift | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/TSWeChat/General/TSProgressHUD.swift b/TSWeChat/General/TSProgressHUD.swift index c0f6cf3..8256a4f 100644 --- a/TSWeChat/General/TSProgressHUD.swift +++ b/TSWeChat/General/TSProgressHUD.swift @@ -51,30 +51,39 @@ class TSProgressHUD: NSObject { //私有方法 private class func TSProgressHUDShow(type: HUDType, status: String? = nil, error: NSError? = nil) { + SVProgressHUD.setDefaultMaskType(.None) switch type { case .Success: + SVProgressHUD.showSuccessWithStatus(status) + SVProgressHUD.showSuccessWithStatus(status, maskType: .None) break case .ErrorObject: guard let newError = error else { - SVProgressHUD.showErrorWithStatus("Error:出错拉", maskType: .None) + SVProgressHUD.showErrorWithStatus("Error:出错拉") +// SVProgressHUD.showErrorWithStatus("Error:出错拉", maskType: .None) return } if newError.localizedFailureReason == nil { - SVProgressHUD.showErrorWithStatus("Error:出错拉", maskType: .None) + SVProgressHUD.showErrorWithStatus("Error:出错拉") +// SVProgressHUD.showErrorWithStatus("Error:出错拉", maskType: .None) } else { - SVProgressHUD.showErrorWithStatus(error!.localizedFailureReason, maskType: .None) + SVProgressHUD.showErrorWithStatus(error!.localizedFailureReason) +// SVProgressHUD.showErrorWithStatus(error!.localizedFailureReason, maskType: .None) } break case .ErrorString: - SVProgressHUD.showErrorWithStatus(status, maskType: .None) + SVProgressHUD.showErrorWithStatus(status) +// SVProgressHUD.showErrorWithStatus(status, maskType: .None) break case .Info: - SVProgressHUD.showInfoWithStatus(status, maskType: .None) + SVProgressHUD.showInfoWithStatus(status) +// SVProgressHUD.showInfoWithStatus(status, maskType: .None) break case .Loading: - SVProgressHUD.showWithStatus(status, maskType: .None) + SVProgressHUD.showWithStatus(status) +// SVProgressHUD.showWithStatus(status, maskType: .None) break } } From b94c7f12aa646e4ff68df7c8fd378889314615ac Mon Sep 17 00:00:00 2001 From: Robin <1933549736@qq.com> Date: Wed, 9 Mar 2016 14:24:37 +0800 Subject: [PATCH 2/4] commit miss line --- TSWeChat/General/TSProgressHUD.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TSWeChat/General/TSProgressHUD.swift b/TSWeChat/General/TSProgressHUD.swift index 8256a4f..aa32c90 100644 --- a/TSWeChat/General/TSProgressHUD.swift +++ b/TSWeChat/General/TSProgressHUD.swift @@ -56,7 +56,7 @@ class TSProgressHUD: NSObject { case .Success: SVProgressHUD.showSuccessWithStatus(status) - SVProgressHUD.showSuccessWithStatus(status, maskType: .None) +// SVProgressHUD.showSuccessWithStatus(status, maskType: .None) break case .ErrorObject: guard let newError = error else { From 0607493e240b93ba00d3437029e01fd622245612 Mon Sep 17 00:00:00 2001 From: Robin <1933549736@qq.com> Date: Wed, 9 Mar 2016 14:37:10 +0800 Subject: [PATCH 3/4] fix the UI update in background thread bugs --- TSWeChat/Classes/Chat/ChatHelper/AudioRecordManager.swift | 4 +++- .../Classes/Chat/TSChatViewController+Interaction.swift | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/TSWeChat/Classes/Chat/ChatHelper/AudioRecordManager.swift b/TSWeChat/Classes/Chat/ChatHelper/AudioRecordManager.swift index a836735..9e9c848 100644 --- a/TSWeChat/Classes/Chat/ChatHelper/AudioRecordManager.swift +++ b/TSWeChat/Classes/Chat/ChatHelper/AudioRecordManager.swift @@ -50,7 +50,9 @@ class AudioRecordManager: NSObject { try session.setActive(true) session.requestRecordPermission{allowed in if !allowed { - TSAlertView_show("无法访问您的麦克风", message: "请到设置 -> 隐私 -> 麦克风 ,打开访问权限") + dispatch_async_safely_to_main_queue({ () -> () in + TSAlertView_show("无法访问您的麦克风", message: "请到设置 -> 隐私 -> 麦克风 ,打开访问权限") + }) } } } catch let error as NSError { diff --git a/TSWeChat/Classes/Chat/TSChatViewController+Interaction.swift b/TSWeChat/Classes/Chat/TSChatViewController+Interaction.swift index 46f421e..aba3433 100644 --- a/TSWeChat/Classes/Chat/TSChatViewController+Interaction.swift +++ b/TSWeChat/Classes/Chat/TSChatViewController+Interaction.swift @@ -53,7 +53,11 @@ extension TSChatViewController: ChatShareMoreViewDelegate { func checkCameraPermission () { AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: {granted in if !granted { - TSAlertView_show("无法访问您的相机", message: "请到设置 -> 隐私 -> 相机 ,打开访问权限" ) + + dispatch_async_safely_to_main_queue({ () -> () in + TSAlertView_show("无法访问您的相机", message: "请到设置 -> 隐私 -> 相机 ,打开访问权限" ) + }) + } }) } From bca13b64f8fef509a0eac40e5f5b7052e6496f5b Mon Sep 17 00:00:00 2001 From: Robin <1933549736@qq.com> Date: Wed, 9 Mar 2016 14:50:54 +0800 Subject: [PATCH 4/4] add RCActionSheet RCActionSheet like we chat style --- TSWeChat.xcodeproj/project.pbxproj | 20 ++ .../TSChatViewController+Interaction.swift | 11 +- .../Vendor/RCActionSheet/RCActionSheet.swift | 213 ++++++++++++++++++ .../Vendor/RCActionSheet/bgImage_HL@2x.png | Bin 0 -> 2798 bytes TSWeChat/Vendor/RCActionSheet/cellLine@2x.png | Bin 0 -> 6410 bytes 5 files changed, 242 insertions(+), 2 deletions(-) create mode 100644 TSWeChat/Vendor/RCActionSheet/RCActionSheet.swift create mode 100755 TSWeChat/Vendor/RCActionSheet/bgImage_HL@2x.png create mode 100755 TSWeChat/Vendor/RCActionSheet/cellLine@2x.png diff --git a/TSWeChat.xcodeproj/project.pbxproj b/TSWeChat.xcodeproj/project.pbxproj index 24fbcb3..cb5f46b 100644 --- a/TSWeChat.xcodeproj/project.pbxproj +++ b/TSWeChat.xcodeproj/project.pbxproj @@ -7,6 +7,9 @@ objects = { /* Begin PBXBuildFile section */ + 00DD43341C8FFC9D00787685 /* bgImage_HL@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00DD43311C8FFC9D00787685 /* bgImage_HL@2x.png */; }; + 00DD43351C8FFC9D00787685 /* cellLine@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 00DD43321C8FFC9D00787685 /* cellLine@2x.png */; }; + 00DD43361C8FFC9D00787685 /* RCActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00DD43331C8FFC9D00787685 /* RCActionSheet.swift */; }; 521AD1D46345C1A90F878475 /* Pods_TSWeChat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F0917A01A536A5EE41BF160D /* Pods_TSWeChat.framework */; }; AE3CBC551C854B90008BA4AC /* TSChatDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE3CBC541C854B90008BA4AC /* TSChatDataManager.swift */; }; AE3CBC5A1C858C3F008BA4AC /* TSChatViewController+TestData.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE3CBC591C858C3F008BA4AC /* TSChatViewController+TestData.swift */; }; @@ -165,6 +168,9 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 00DD43311C8FFC9D00787685 /* bgImage_HL@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bgImage_HL@2x.png"; sourceTree = ""; }; + 00DD43321C8FFC9D00787685 /* cellLine@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "cellLine@2x.png"; sourceTree = ""; }; + 00DD43331C8FFC9D00787685 /* RCActionSheet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RCActionSheet.swift; sourceTree = ""; }; 879C4C7737B3D4DA6504869D /* Pods-TSWeChat.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TSWeChat.debug.xcconfig"; path = "Pods/Target Support Files/Pods-TSWeChat/Pods-TSWeChat.debug.xcconfig"; sourceTree = ""; }; AE3CBC541C854B90008BA4AC /* TSChatDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TSChatDataManager.swift; sourceTree = ""; }; AE3CBC591C858C3F008BA4AC /* TSChatViewController+TestData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TSChatViewController+TestData.swift"; sourceTree = ""; }; @@ -358,6 +364,16 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 00DD43301C8FFC9D00787685 /* RCActionSheet */ = { + isa = PBXGroup; + children = ( + 00DD43311C8FFC9D00787685 /* bgImage_HL@2x.png */, + 00DD43321C8FFC9D00787685 /* cellLine@2x.png */, + 00DD43331C8FFC9D00787685 /* RCActionSheet.swift */, + ); + path = RCActionSheet; + sourceTree = ""; + }; 18FCDE5FEB0C6C5536DF0CBA /* Pods */ = { isa = PBXGroup; children = ( @@ -506,6 +522,7 @@ AE92B6C01C3FF7C900968A3A /* Vendor */ = { isa = PBXGroup; children = ( + 00DD43301C8FFC9D00787685 /* RCActionSheet */, AEE69BDB1C81B61200C69224 /* VoiceConvert */, ); path = Vendor; @@ -873,6 +890,7 @@ AE8742921C7B3547003A435C /* TSContactTableViewCell.xib in Resources */, AEBEE5A91C87345700956B0C /* contact.json in Resources */, AEBEE5A81C87345700956B0C /* chat.json in Resources */, + 00DD43351C8FFC9D00787685 /* cellLine@2x.png in Resources */, AE8742881C7B079B003A435C /* TSMeAvatarTableViewCell.xib in Resources */, AEE69C051C81B61200C69224 /* libopencore-amrnb.la in Resources */, AE92B8C01C3FFC5D00968A3A /* TSMessageViewController.xib in Resources */, @@ -887,6 +905,7 @@ AEE69C0D1C81B61200C69224 /* opencore-amrnb.pc in Resources */, AEE69BAB1C81B58600C69224 /* TSChatVoiceCell.xib in Resources */, AEE69BD11C81B58600C69224 /* TSChatShareMoreView.xib in Resources */, + 00DD43341C8FFC9D00787685 /* bgImage_HL@2x.png in Resources */, AEE69C0E1C81B61200C69224 /* opencore-amrwb.pc in Resources */, AEBEE5AA1C87345700956B0C /* message.json in Resources */, AE87428A1C7B0D7D003A435C /* Kenny.jpg in Resources */, @@ -1048,6 +1067,7 @@ AE87425E1C7AE0F1003A435C /* TSUserDefaults.swift in Sources */, AEE69BBF1C81B58600C69224 /* TSChatViewController+ActionBar.swift in Sources */, AE8F49B01C46A905009C1541 /* NSDictionary+Extension.swift in Sources */, + 00DD43361C8FFC9D00787685 /* RCActionSheet.swift in Sources */, AE8742911C7B3547003A435C /* TSContactTableViewCell.swift in Sources */, AE92B8C71C3FFCE900968A3A /* TSMeViewController.swift in Sources */, AEBEE5A01C8706B800956B0C /* TSUploadModel.swift in Sources */, diff --git a/TSWeChat/Classes/Chat/TSChatViewController+Interaction.swift b/TSWeChat/Classes/Chat/TSChatViewController+Interaction.swift index aba3433..28cd57e 100644 --- a/TSWeChat/Classes/Chat/TSChatViewController+Interaction.swift +++ b/TSWeChat/Classes/Chat/TSChatViewController+Interaction.swift @@ -270,13 +270,14 @@ extension TSChatViewController: TSChatCellDelegate { 点击了 cell 本身 */ func cellDidTaped(cell: TSChatBaseCell) { - + // TODO: goto content viewer } /** 点击了 cell 的头像 */ func cellDidTapedAvatarImage(cell: TSChatBaseCell) { + //TODO: goto user's profile TSAlertView_show("点击了头像") } @@ -284,6 +285,7 @@ extension TSChatViewController: TSChatCellDelegate { 点击了 cell 的图片 */ func cellDidTapedImageView(cell: TSChatBaseCell) { + // TODO: goto image viewer TSAlertView_show("点击了图片") } @@ -299,7 +301,12 @@ extension TSChatViewController: TSChatCellDelegate { 点击了 cell 中文字的 电话 */ func cellDidTapedPhone(cell: TSChatBaseCell, phoneString: String) { - TSAlertView_show("点击了电话") + // TOTO: show mobile operation +// TSAlertView_show("点击了电话") + + let actionSheet = RCActionSheet.actionSheet(title: "点击了电话", buttonTitles: ["复制", "打电话", "保存"], redButtonIndex: -1, delegate: nil) + actionSheet.show() + } /** diff --git a/TSWeChat/Vendor/RCActionSheet/RCActionSheet.swift b/TSWeChat/Vendor/RCActionSheet/RCActionSheet.swift new file mode 100644 index 0000000..8168cf1 --- /dev/null +++ b/TSWeChat/Vendor/RCActionSheet/RCActionSheet.swift @@ -0,0 +1,213 @@ + + +import UIKit + + + @objc protocol RCActionSheetDelegate { + optional func actionSheet(actionSheet: RCActionSheet, didClickedWithButtonIndex: Int) + } + + + +class RCActionSheet: UIView { + + let button_height: CGFloat = 49.0 + let screenSize = UIScreen.mainScreen().bounds.size + + private func colorFrom(red: CGFloat, green: CGFloat, blue: CGFloat) -> UIColor { + return UIColor(red: (red)/255.0, green: (green)/255.0, blue: (blue)/255.0, alpha: 1.0) + } + + + var delegate: RCActionSheetDelegate? + private var buttonTitles = [String]() + private var maskBackView = UIView() + private var bottomView = UIView() + private var backWindow: UIWindow? + + override init(frame: CGRect) { + super.init(frame: frame) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // public methods + static func actionSheet(title title: String? = nil, buttonTitles: [String], redButtonIndex: Int, delegate: RCActionSheetDelegate? = nil) -> RCActionSheet { + return RCActionSheet(actionTitle: title, buttonTitles: buttonTitles, redButtonIndex: redButtonIndex, delegate: delegate) + } + + convenience init(actionTitle: String? = nil, buttonTitles: [String], redButtonIndex: Int, delegate: RCActionSheetDelegate? = nil) { + self.init() + + self.delegate = delegate + + let backView = UIView(frame: CGRectMake(0, 0, screenSize.width, screenSize.height)) + backView.alpha = 0 + backView.userInteractionEnabled = false + backView.backgroundColor = self.colorFrom(46.0, green: 49.0, blue: 50.0) + self.addSubview(backView) + self.maskBackView = backView + + let tap = UITapGestureRecognizer(target: self, action: Selector("dismiss:")) + backView.addGestureRecognizer(tap) + + let bView = UIView() + bView.backgroundColor = self.colorFrom(233, green: 233, blue: 238) + self.addSubview(bView) + self.bottomView = bView + + + if let titleString = actionTitle { + let titleLabel = UILabel(frame: CGRectMake(0, 0, screenSize.width, button_height)) + titleLabel.text = titleString as String + titleLabel.textColor = self.colorFrom(111, green: 111, blue: 111) + titleLabel.textAlignment = .Center + titleLabel.font = UIFont.systemFontOfSize(13.0) + titleLabel.backgroundColor = UIColor.whiteColor() + bottomView.addSubview(titleLabel) + } + + if buttonTitles.count > 0 { + self.buttonTitles = buttonTitles + + for (index, title) in buttonTitles.enumerate() { + let button = UIButton() + button.tag = index + button.backgroundColor = UIColor.whiteColor() + button.setTitle(title, forState: .Normal) + button.titleLabel?.font = UIFont.systemFontOfSize(16.0) + + var titleColor: UIColor + if index == redButtonIndex { + titleColor = self.colorFrom(255, green: 10, blue: 10) + }else{ + titleColor = UIColor.blackColor() + } + button.setTitleColor(titleColor, forState: .Normal) + + + let backImage = UIImage(named: "bgImage_HL") + button.setBackgroundImage(backImage, forState: .Highlighted) + button.addTarget(self, action: Selector("didClickBtn:"), forControlEvents: .TouchUpInside) + + let a = (actionTitle != nil ? 1 : 0) + let b = a + index + let buttonY = button_height * CGFloat(b) + + button.frame = CGRectMake(0, buttonY, screenSize.width, button_height) + bottomView.addSubview(button) + } + + for (index, _) in buttonTitles.enumerate() { + let lineView = UIImageView(image: UIImage(named: "cellLine")) + lineView.contentMode = .Center + + let a = (actionTitle != nil ? 1 : 0) + let b = a + index + let lineY = button_height * CGFloat(b) + + lineView.frame = CGRectMake(0, lineY, screenSize.width, 1.0) + bottomView.addSubview(lineView) + } + } + + let cancelButton = UIButton() + cancelButton.tag = buttonTitles.count + cancelButton.backgroundColor = UIColor.whiteColor() + cancelButton.setTitle("Cancel", forState: .Normal) + cancelButton.titleLabel?.font = UIFont.systemFontOfSize(16.0) + cancelButton.setTitleColor(UIColor.blackColor(), forState: .Normal) + cancelButton.setBackgroundImage(UIImage(named: "bgImage_HL"), forState: .Highlighted) + cancelButton.addTarget(self, action: Selector("didClickCancelBtn:"), forControlEvents: .TouchUpInside) + + + let a = (actionTitle != nil ? 1 : 0) + let b = a + self.buttonTitles.count + let cancelY = button_height * CGFloat(b) + 5.0 + cancelButton.frame = CGRectMake(0, cancelY, screenSize.width, button_height) + bottomView.addSubview(cancelButton) + + let x = (actionTitle != nil ? button_height : 0) + let bottomH = x + button_height * CGFloat(buttonTitles.count) + button_height + 5 + bottomView.frame = CGRectMake(0, screenSize.height, screenSize.width, bottomH) + + + self.frame = CGRectMake(0, 0, screenSize.width, screenSize.height) + getBackWindow().addSubview(self) + } + + + private func getBackWindow() -> UIWindow{ + if self.backWindow == nil { + let window: UIWindow = UIWindow(frame: UIScreen.mainScreen().bounds) + window.windowLevel = UIWindowLevelStatusBar + window.backgroundColor = UIColor.clearColor() + window.hidden = false + self.backWindow = window + } + + return self.backWindow! + } + + func didClickBtn(button: UIButton) { + dismiss(nil) + + if let rDelegate = self.delegate { + rDelegate.actionSheet!(self, didClickedWithButtonIndex: button.tag) + } + } + + func didClickCancelBtn(button: UIButton){ + UIView.animateWithDuration(0.23, delay: 0, options: .CurveEaseInOut, animations: { () -> Void in + self.maskBackView.alpha = 0 + self.maskBackView.userInteractionEnabled = false + + var frame = self.bottomView.frame + frame.origin.y += frame.size.height + self.bottomView.frame = frame + + }) { (finished) -> Void in + self.getBackWindow().hidden = true + self.removeFromSuperview() + + if let rDelegate = self.delegate { + rDelegate.actionSheet!(self, didClickedWithButtonIndex: self.buttonTitles.count) + } + } + + } + + func dismiss(tap: UITapGestureRecognizer?){ + UIView.animateWithDuration(0.23, delay: 0, options: .CurveEaseInOut, animations: { () -> Void in + self.maskBackView.alpha = 0 + self.maskBackView.userInteractionEnabled = false + + var frame = self.bottomView.frame + frame.origin.y += frame.size.height + self.bottomView.frame = frame + + }) { (finished) -> Void in + self.getBackWindow().hidden = true + self.removeFromSuperview() + } + } + + + + func show(){ + getBackWindow().hidden = false + UIView.animateWithDuration(0.23, delay: 0, options: .CurveEaseInOut, animations: { () -> Void in + self.maskBackView.alpha = 0.4 + self.maskBackView.userInteractionEnabled = true + + var frame = self.bottomView.frame + frame.origin.y -= frame.size.height + self.bottomView.frame = frame + + }) { (finished) -> Void in + print("finished: \(finished)") + } + } +} diff --git a/TSWeChat/Vendor/RCActionSheet/bgImage_HL@2x.png b/TSWeChat/Vendor/RCActionSheet/bgImage_HL@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..b887b9569ddf4d45176edd5d77120e05cc40a6e2 GIT binary patch literal 2798 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 A1^@s6 literal 0 HcmV?d00001 diff --git a/TSWeChat/Vendor/RCActionSheet/cellLine@2x.png b/TSWeChat/Vendor/RCActionSheet/cellLine@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..1e4987f6a8ab844f4ec6ccc8de604ae3eb7a5812 GIT binary patch literal 6410 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