DolphinEnglishLearnStudent.xcodeproj/project.pbxproj
@@ -111,6 +111,9 @@ 13EEB8A82BFF354B002996FC /* HomeListen_item_TCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13EEB8A62BFF354B002996FC /* HomeListen_item_TCell.swift */; }; 13EEB8A92BFF354B002996FC /* HomeListen_item_TCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13EEB8A72BFF354B002996FC /* HomeListen_item_TCell.xib */; }; 13EEB8AB2BFF36E0002996FC /* HomeListenSubVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13EEB8AA2BFF36E0002996FC /* HomeListenSubVC.swift */; }; 13EFFA762C22D0EA00F072E7 /* ShareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13EFFA752C22D0EA00F072E7 /* ShareView.swift */; }; 13EFFA792C22D0FC00F072E7 /* ShareView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13EFFA782C22D0FC00F072E7 /* ShareView.xib */; }; 13EFFA7B2C22D6D100F072E7 /* WeChatTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13EFFA7A2C22D6D100F072E7 /* WeChatTools.swift */; }; AABBA9CFF928AFAC4A01F16D /* Pods_DolphinEnglishLearnStudent.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA21DA5F8583B67AC7D13D0A /* Pods_DolphinEnglishLearnStudent.framework */; }; /* End PBXBuildFile section */ @@ -222,6 +225,11 @@ 13EEB8A62BFF354B002996FC /* HomeListen_item_TCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeListen_item_TCell.swift; sourceTree = "<group>"; }; 13EEB8A72BFF354B002996FC /* HomeListen_item_TCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeListen_item_TCell.xib; sourceTree = "<group>"; }; 13EEB8AA2BFF36E0002996FC /* HomeListenSubVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeListenSubVC.swift; sourceTree = "<group>"; }; 13EFFA752C22D0EA00F072E7 /* ShareView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareView.swift; sourceTree = "<group>"; }; 13EFFA782C22D0FC00F072E7 /* ShareView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ShareView.xib; sourceTree = "<group>"; }; 13EFFA7A2C22D6D100F072E7 /* WeChatTools.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WeChatTools.swift; sourceTree = "<group>"; }; 13EFFA7C2C22D7C500F072E7 /* DolphinEnglishLearnStudent-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DolphinEnglishLearnStudent-Bridging-Header.h"; sourceTree = "<group>"; }; 13EFFA802C22D86E00F072E7 /* DolphinEnglishLearnStudent.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DolphinEnglishLearnStudent.entitlements; sourceTree = "<group>"; }; E76DEF4767EBA86DA360D0D8 /* Pods-DolphinEnglishLearnStudent.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DolphinEnglishLearnStudent.debug.xcconfig"; path = "Target Support Files/Pods-DolphinEnglishLearnStudent/Pods-DolphinEnglishLearnStudent.debug.xcconfig"; sourceTree = "<group>"; }; EA21DA5F8583B67AC7D13D0A /* Pods_DolphinEnglishLearnStudent.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DolphinEnglishLearnStudent.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -259,6 +267,7 @@ 130278282BFD957100DDCE81 /* DolphinEnglishLearnStudent */ = { isa = PBXGroup; children = ( 13EFFA802C22D86E00F072E7 /* DolphinEnglishLearnStudent.entitlements */, 13CD3AC52C08749E007E1065 /* Models */, 1319B0332C0859D70052F889 /* ViewModel */, 1319B02E2C08592D0052F889 /* Services */, @@ -273,6 +282,7 @@ 130278322BFD957300DDCE81 /* Assets.xcassets */, 130278342BFD957300DDCE81 /* LaunchScreen.storyboard */, 130278372BFD957300DDCE81 /* Info.plist */, 13EFFA7C2C22D7C500F072E7 /* DolphinEnglishLearnStudent-Bridging-Header.h */, ); path = DolphinEnglishLearnStudent; sourceTree = "<group>"; @@ -293,6 +303,7 @@ 130278402BFD978900DDCE81 /* Config */ = { isa = PBXGroup; children = ( 13EFFA7A2C22D6D100F072E7 /* WeChatTools.swift */, 13E99EF92C1FD1A9004F52D4 /* LaunchImageHelper.swift */, 1302783E2BFD978900DDCE81 /* Config.swift */, 1302783F2BFD978900DDCE81 /* Enums.swift */, @@ -372,6 +383,7 @@ 130278692BFD9EA700DDCE81 /* Me */ = { isa = PBXGroup; children = ( 13EFFA772C22D0F200F072E7 /* View */, 1302788F2BFD9FA100DDCE81 /* TCell */, 1302788A2BFD9F2C00DDCE81 /* VC */, 130278802BFD9F0700DDCE81 /* MeVC.swift */, @@ -568,6 +580,15 @@ path = TCell; sourceTree = "<group>"; }; 13EFFA772C22D0F200F072E7 /* View */ = { isa = PBXGroup; children = ( 13EFFA752C22D0EA00F072E7 /* ShareView.swift */, 13EFFA782C22D0FC00F072E7 /* ShareView.xib */, ); path = View; sourceTree = "<group>"; }; 3CD7B950C551024F77E6409B /* Pods */ = { isa = PBXGroup; children = ( @@ -619,6 +640,7 @@ TargetAttributes = { 130278252BFD957100DDCE81 = { CreatedOnToolsVersion = 15.3; LastSwiftMigration = 1530; }; }; }; @@ -665,6 +687,7 @@ 1302787A2BFD9ED600DDCE81 /* ExchangeResultVC.xib in Resources */, 130278362BFD957300DDCE81 /* Base in Resources */, 13397D972C05EA9D003440F9 /* ListenFight_Game_CCell.xib in Resources */, 13EFFA792C22D0FC00F072E7 /* ShareView.xib in Resources */, 1302788E2BFD9F4200DDCE81 /* CoinRecordHistoryVC.xib in Resources */, 130278312BFD957100DDCE81 /* Base in Resources */, 1362C7612BFF4BB100BD7F73 /* StudyHandleView.xib in Resources */, @@ -780,7 +803,9 @@ 13A049FF2C058B1400F1F52E /* HomeListenFight_lesson_5_VC.swift in Sources */, 1302785A2BFD985E00DDCE81 /* CommonAlertView.swift in Sources */, 13CD3AC92C0886E5007E1065 /* RefreshModel.swift in Sources */, 13EFFA7B2C22D6D100F072E7 /* WeChatTools.swift in Sources */, 1302782C2BFD957100DDCE81 /* SceneDelegate.swift in Sources */, 13EFFA762C22D0EA00F072E7 /* ShareView.swift in Sources */, 1302787D2BFD9ED600DDCE81 /* MarketExchangeVC.swift in Sources */, 1302789A2BFD9FBF00DDCE81 /* AddressManageTCell.swift in Sources */, 1319B02C2C081A320052F889 /* SimpleImageCCell.swift in Sources */, @@ -951,6 +976,8 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = DolphinEnglishLearnStudent/DolphinEnglishLearnStudent.entitlements; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; @@ -979,6 +1006,8 @@ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OBJC_BRIDGING_HEADER = "DolphinEnglishLearnStudent/DolphinEnglishLearnStudent-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 2; }; @@ -990,6 +1019,8 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = DolphinEnglishLearnStudent/DolphinEnglishLearnStudent.entitlements; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; @@ -1015,6 +1046,7 @@ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OBJC_BRIDGING_HEADER = "DolphinEnglishLearnStudent/DolphinEnglishLearnStudent-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 2; }; DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wx.imageset/Contents.json
New file @@ -0,0 +1,22 @@ { "images" : [ { "filename" : "share_wx.png", "idiom" : "universal", "scale" : "1x" }, { "filename" : "share_wx@2x.png", "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wx.imageset/share_wx.png
DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wx.imageset/share_wx@2x.png
DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wxFri.imageset/Contents.json
New file @@ -0,0 +1,22 @@ { "images" : [ { "filename" : "share_wxFri.png", "idiom" : "universal", "scale" : "1x" }, { "filename" : "share_wxFri@2x.png", "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wxFri.imageset/share_wxFri.png
DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wxFri.imageset/share_wxFri@2x.png
DolphinEnglishLearnStudent/Config/Config.swift
@@ -12,6 +12,10 @@ @_exported import JQTools let WeChatAPPID = "wx723c6b080f204773" let WeChatSecrect = "b7904c5721aeccc20fd11fe9afc23f4d" var sceneDelegate:SceneDelegate? = { var uiScreen:UIScene? UIApplication.shared.connectedScenes.forEach { scenes in DolphinEnglishLearnStudent/Config/WeChatTools.swift
New file @@ -0,0 +1,205 @@ // // WeChatTools.swift // WanPai // // Created by 无故事王国 on 2023/9/26. // import Foundation import HandyJSON typealias WeachatClosure = (WechatModel?)->(Void) typealias WechatUserClosure = (WechatUserInfoModel?)->(Void) struct WechatModel:HandyJSON{ var access_token = "" var expires_in = 0 var openid = "" var refresh_token = "" var scope = "" var unionid = "" } struct WechatUserInfoModel:HandyJSON{ var openid = "" var nickname = "" var sex = 1 var province = "" var city = "" var country = "" var headimgurl = "" var privilege = "" var unionid = "" } class WeChatTools{ static func register(appid:String,link:String){ WXApi.registerApp(appid, universalLink: link) } /// 授权登录 static func sendAuthRequest(){ let sendAuthReq = SendAuthReq() sendAuthReq.scope = "snsapi_userinfo" sendAuthReq.state = "dolpinEnglishStudent_iOS" WXApi.send(sendAuthReq) } /// 完成授权登录,获取token static func getAccessToken(_ resp:SendAuthResp, loginInfo:WeachatClosure?){ guard resp.code != nil else { return } let url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=\(WeChatAPPID)&secret=\(WeChatSecrect)&code=\(resp.code!)&grant_type=authorization_code" let Url = URL(string: url) let session = URLSession.shared let task = session.dataTask(with: Url!) { (data, response, error) in if error != nil{ return } do{ if let dataAsJSON = try JSONSerialization.jsonObject(with: data!) as? Dictionary<String, Any>{ let model = WechatModel.deserialize(from: dataAsJSON) loginInfo?(model) }else{ loginInfo?(nil) } }catch{ loginInfo?(nil) } } task.resume() } /// 获取用资料 static func getUserInfo(access_token:String,openId:String,userInfo:WechatUserClosure?){ guard !access_token.isEmpty else { return } guard !openId.isEmpty else { return } let url = "https://api.weixin.qq.com/sns/userinfo?access_token=\(access_token)&openid=\(openId)" let Url = URL(string: url) let session = URLSession.shared let task = session.dataTask(with: Url!) { (data, response, error) in if error != nil{ return } do{ if let dataAsJSON = try JSONSerialization.jsonObject(with: data!) as? Dictionary<String, Any>{ let model = WechatUserInfoModel.deserialize(from: dataAsJSON) userInfo?(model) }else{ userInfo?(nil) } }catch{ userInfo?(nil) } } task.resume() } /// 分享文本 static func shareText(_ text:String,scene:WXScene = WXSceneSession){ let req = SendMessageToWXReq() req.bText = true req.text = text req.scene = Int32(scene.rawValue) WXApi.send(req) } /// 分享图片 static func sharePic(_ img:UIImage,thumb:UIImage,scale:CGFloat = 0.6,scene:WXScene = WXSceneTimeline){ let imageObject = WXImageObject() imageObject.imageData = img.jpegData(compressionQuality: scale)! let mediaMessage = WXMediaMessage() mediaMessage.thumbData = thumb.jpegData(compressionQuality: scale) mediaMessage.mediaObject = imageObject let req = SendMessageToWXReq() req.bText = false req.message = mediaMessage req.scene = Int32(scene.rawValue) WXApi.send(req) } /// 分享音乐 static func shareMusic(_ musicUrl:String,musicLowBandUrl:String,title:String,desc:String,thumb:UIImage,scene:WXScene = WXSceneSession){ let musicObject = WXMusicObject() musicObject.musicUrl = musicUrl musicObject.musicLowBandUrl = musicLowBandUrl let mediaMessage = WXMediaMessage() mediaMessage.title = title mediaMessage.description = desc mediaMessage.setThumbImage(thumb) mediaMessage.mediaObject = musicObject let req = SendMessageToWXReq() req.bText = false req.message = mediaMessage req.scene = Int32(scene.rawValue) WXApi.send(req) } /// 分享音乐 static func shareMusic(_ musicData:String,musicLowBandData:String,title:String,desc:String,thumb:UIImage,scene:WXScene = WXSceneSession){ let musicObject = WXMusicObject() musicObject.musicDataUrl = musicData musicObject.musicLowBandUrl = musicLowBandData let mediaMessage = WXMediaMessage() mediaMessage.title = title mediaMessage.description = desc mediaMessage.setThumbImage(thumb) mediaMessage.mediaObject = musicObject let req = SendMessageToWXReq() req.bText = false req.message = mediaMessage req.scene = Int32(scene.rawValue) WXApi.send(req) } static func shareUrl(_ url:String,title:String,desc:String,thumb:UIImage,scene:WXScene = WXSceneSession){ let webpageObject = WXWebpageObject() webpageObject.webpageUrl = url let mediaMessage = WXMediaMessage() mediaMessage.title = title mediaMessage.description = desc mediaMessage.setThumbImage(thumb) mediaMessage.mediaObject = webpageObject let req = SendMessageToWXReq() req.bText = false req.message = mediaMessage req.scene = Int32(scene.rawValue) WXApi.send(req) } static func shareVideo(_ url:String,videoLowBandUrl:String,title:String,desc:String,thumb:UIImage, scene:WXScene = WXSceneSession){ let videoObject = WXVideoObject() videoObject.videoUrl = url videoObject.videoLowBandUrl = videoLowBandUrl let mediaMessage = WXMediaMessage() mediaMessage.title = title mediaMessage.description = desc mediaMessage.setThumbImage(thumb) mediaMessage.mediaObject = videoObject let req = SendMessageToWXReq() req.bText = false req.message = mediaMessage req.scene = Int32(scene.rawValue) WXApi.send(req) } } DolphinEnglishLearnStudent/DolphinEnglishLearnStudent-Bridging-Header.h
New file @@ -0,0 +1,5 @@ // // Use this file to import your target's public headers that you would like to expose to Swift. // #import "WXApi.h" DolphinEnglishLearnStudent/DolphinEnglishLearnStudent.entitlements
New file @@ -0,0 +1,10 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.developer.associated-domains</key> <array> <string>applinks:dollearn/app/</string> </array> </dict> </plist> DolphinEnglishLearnStudent/Info.plist
@@ -2,6 +2,8 @@ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleAllowMixedLocalizations</key> <true/> <key>CFBundleURLTypes</key> <array> <dict> @@ -9,10 +11,18 @@ <string>Editor</string> <key>CFBundleURLSchemes</key> <array> <string>dolpinEnglish</string> <string>wx723c6b080f204773</string> </array> </dict> </array> <key>LSApplicationQueriesSchemes</key> <array> <string>weixin</string> <string>weixinAPI</string> <string>weixinURLParamsAPI</string> </array> <key>Localization native development region</key> <string>China</string> <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_Game_CCell.swift
@@ -6,6 +6,7 @@ // import UIKit import Lantern class ListenFight_Game_CCell: UICollectionViewCell { @@ -52,6 +53,36 @@ img_cover.sd_setImage(with: URL(string: m.img)) } @IBAction func fullScreenAction(_ sender: UIButton) { let lantern = Lantern() lantern.numberOfItems = { () in return 1 } lantern.cellClassAtIndex = { _ in LanternImageCell.self } lantern.transitionAnimator = LanternZoomAnimator(previousView: { [weak self] index -> UIView? in return self?.img_cover }) // UIPageIndicator样式的页码指示器 lantern.pageIndicator = LanternDefaultPageIndicator() lantern.pageIndex = 0 lantern.reloadCellAtIndex = { context in let lanternCell = context.cell as? LanternImageCell lanternCell?.imageView.image = self.img_cover.image } //不要使用push lantern.show() } override func layoutSubviews() { super.layoutSubviews() view_top.jq_addCorners(corner: [.topLeft,.topRight], radius: 8) DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_Game_CCell.xib
@@ -34,6 +34,9 @@ <rect key="frame" x="121" y="166" width="34" height="34"/> <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> <state key="normal" image="icon_fullScreen"/> <connections> <action selector="fullScreenAction:" destination="gTV-IL-0wX" eventType="touchUpInside" id="lBy-hW-25q"/> </connections> </button> <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_success" translatesAutoresizingMaskIntoConstraints="NO" id="dMD-2P-QwE"> <rect key="frame" x="49.5" y="74" width="56" height="56"/> DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift
@@ -6,6 +6,7 @@ // import UIKit import Lantern class HomeListenFight_lesson_3_VC: BaseVC { @@ -264,7 +265,41 @@ } @objc private func fullscreenAction(btn:UIButton){ print("全屏:\(btn.tag)") var answerView:Lesson_3_AnswerView! for (_,v) in (stackView.arrangedSubviews as! [Lesson_3_AnswerView]).enumerated(){ if v.btn_fullscreen.tag == btn.tag{ answerView = v;break } } let lantern = Lantern() lantern.numberOfItems = { () in return 1 } lantern.cellClassAtIndex = { _ in LanternImageCell.self } lantern.transitionAnimator = LanternZoomAnimator(previousView: { index -> UIView? in return answerView.img_cover }) // UIPageIndicator样式的页码指示器 lantern.pageIndicator = LanternDefaultPageIndicator() lantern.pageIndex = 0 lantern.reloadCellAtIndex = { context in let lanternCell = context.cell as? LanternImageCell lanternCell?.imageView.image = answerView.img_cover.image } //不要使用push lantern.show() } } DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_1_VC.swift
@@ -303,9 +303,6 @@ self.label_hint.text = "准备请听下一题" DispatchQueue.main.asyncAfter(deadline: .now()+3) { self.times = self.listen1Model?.data?.time ?? 10 #if DEBUG self.times = 60 #endif self.totalCount += 1 self.rootViewModel.correctNum += 1 self.label_class.text = "\(self.totalCount)" DolphinEnglishLearnStudent/Moudle/Me/MeVC.swift
@@ -83,7 +83,19 @@ } @IBAction func shareAction(_ sender: QMUIButton) { if WXApi.isWXAppSupportStateAPI(){ ShareView.show() }else{ let urlStr = "https://dollearn.com/" if let url = URL(string: urlStr) { let activityVC = UIActivityViewController(activityItems: [url], applicationActivities: nil) activityVC.popoverPresentationController?.sourceView = self.view let senderCenter = sender.convert(sender.bounds, to: self.view) activityVC.popoverPresentationController?.sourceRect = CGRect(origin:senderCenter.center, size: CGSize(width: 1, height: 1)) present(activityVC, animated: true, completion: nil) } } } @IBAction func quitAction(_ sender: UIButton) { DolphinEnglishLearnStudent/Moudle/Me/View/ShareView.swift
New file @@ -0,0 +1,52 @@ // // ShareView.swift // DolphinEnglishLearnStudent // // Created by 无故事王国 on 2024/6/19. // import UIKit import JQTools import QMUIKit class ShareView: UIView,JQNibView{ @IBOutlet weak var view_content: UIView! @IBOutlet weak var cons_bottom: NSLayoutConstraint! @IBOutlet weak var btn_wx: QMUIButton! @IBOutlet weak var btn_wxFri: QMUIButton! override func awakeFromNib() { super.awakeFromNib() btn_wx.imagePosition = .top btn_wxFri.imagePosition = .top btn_wx.spacingBetweenImageAndTitle = 8 btn_wxFri.spacingBetweenImageAndTitle = 8 cons_bottom.constant = -JQ_ScreenW alpha = 0 layoutIfNeeded() } static func show(){ let shareView = ShareView.jq_loadNibView() shareView.frame = sceneDelegate?.window?.frame ?? .zero sceneDelegate?.window?.addSubview(shareView) shareView.cons_bottom.constant = 0 UIView.animate(withDuration: 0.4) { shareView.layoutIfNeeded() shareView.alpha = 1 } } @IBAction func closeAction(_ sender: UIButton) { cons_bottom.constant = -JQ_ScreenW UIView.animate(withDuration: 0.4) { self.alpha = 0 self.layoutIfNeeded() }completion: { _ in self.removeFromSuperview() } } } DolphinEnglishLearnStudent/Moudle/Me/View/ShareView.xib
New file @@ -0,0 +1,97 @@ <?xml version="1.0" encoding="UTF-8"?> <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> <device id="ipad10_9rounded" orientation="landscape" layout="fullscreen" appearance="light"/> <dependencies> <deployment identifier="iOS"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/> <capability name="Safe area layout guides" minToolsVersion="9.0"/> <capability name="System colors in document resources" minToolsVersion="11.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> <objects> <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="ShareView" customModule="DolphinEnglishLearnStudent" customModuleProvider="target"> <rect key="frame" x="0.0" y="0.0" width="1180" height="820"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FYo-U3-DCE"> <rect key="frame" x="0.0" y="587.5" width="1180" height="232.5"/> <subviews> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="分享方式" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UvO-uQ-x4L"> <rect key="frame" x="553.5" y="16" width="73.5" height="21.5"/> <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="18"/> <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> </label> <stackView opaque="NO" contentMode="scaleToFill" spacing="195" translatesAutoresizingMaskIntoConstraints="NO" id="QCL-dY-yrF"> <rect key="frame" x="398.5" y="97.5" width="383" height="51"/> <subviews> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="yhD-N5-Thb" customClass="QMUIButton"> <rect key="frame" x="0.0" y="0.0" width="100" height="51"/> <fontDescription key="fontDescription" type="system" pointSize="12"/> <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> <state key="normal" title="微信好友" image="share_wx"> <color key="titleColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/> </state> </button> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="pdf-iF-s8i" customClass="QMUIButton"> <rect key="frame" x="295" y="0.0" width="88" height="51"/> <fontDescription key="fontDescription" type="system" pointSize="12"/> <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> <state key="normal" title="朋友圈" image="share_wxFri"> <color key="titleColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/> </state> </button> </subviews> </stackView> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="iGl-Qk-fif"> <rect key="frame" x="1080" y="10" width="35" height="35"/> <constraints> <constraint firstAttribute="width" constant="35" id="BOm-0S-4Zg"/> <constraint firstAttribute="height" constant="35" id="D1J-Ox-ykE"/> </constraints> <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> <state key="normal" image="btn_close_circle"/> <connections> <action selector="closeAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="a7e-6x-k9c"/> </connections> </button> </subviews> <color key="backgroundColor" systemColor="systemBackgroundColor"/> <constraints> <constraint firstItem="QCL-dY-yrF" firstAttribute="top" secondItem="UvO-uQ-x4L" secondAttribute="bottom" constant="60" id="Eer-Jq-yeA"/> <constraint firstItem="iGl-Qk-fif" firstAttribute="top" secondItem="FYo-U3-DCE" secondAttribute="top" constant="10" id="Kak-W0-6L7"/> <constraint firstItem="UvO-uQ-x4L" firstAttribute="top" secondItem="FYo-U3-DCE" secondAttribute="top" constant="16" id="UOu-Ae-ETf"/> <constraint firstAttribute="trailing" secondItem="iGl-Qk-fif" secondAttribute="trailing" constant="65" id="V9H-dk-3ZE"/> <constraint firstItem="QCL-dY-yrF" firstAttribute="centerX" secondItem="FYo-U3-DCE" secondAttribute="centerX" id="Xej-yC-6gP"/> <constraint firstItem="UvO-uQ-x4L" firstAttribute="centerX" secondItem="FYo-U3-DCE" secondAttribute="centerX" id="g4N-ZC-j5u"/> <constraint firstAttribute="width" secondItem="FYo-U3-DCE" secondAttribute="height" multiplier="1:0.1972" id="hji-FF-fZU"/> </constraints> </view> </subviews> <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/> <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.69999999999999996" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstItem="FYo-U3-DCE" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" id="Fy2-3W-zW7"/> <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="FYo-U3-DCE" secondAttribute="trailing" id="cpO-Bd-3jx"/> <constraint firstAttribute="bottom" secondItem="FYo-U3-DCE" secondAttribute="bottom" id="tjg-FW-AJg"/> </constraints> <connections> <outlet property="btn_wx" destination="yhD-N5-Thb" id="Ifz-R6-fvq"/> <outlet property="btn_wxFri" destination="pdf-iF-s8i" id="JMT-Tz-Qey"/> <outlet property="cons_bottom" destination="tjg-FW-AJg" id="DkR-pm-WBb"/> <outlet property="view_content" destination="FYo-U3-DCE" id="TtL-FL-nv8"/> </connections> <point key="canvasLocation" x="56.949152542372886" y="19.756097560975608"/> </view> </objects> <resources> <image name="btn_close_circle" width="26" height="26"/> <image name="share_wx" width="50" height="50"/> <image name="share_wxFri" width="51" height="51"/> <systemColor name="systemBackgroundColor"> <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> </systemColor> </resources> </document> DolphinEnglishLearnStudent/SceneDelegate.swift
@@ -30,6 +30,10 @@ return } loginSuccess() if WXApi.isWXAppInstalled(){ WeChatTools.sendAuthRequest() } } func sceneDidDisconnect(_ scene: UIScene) { Podfile
@@ -15,5 +15,6 @@ pod 'CryptoSwift' # 常用加密算法 pod 'Alamofire' # 网络请求框架 pod 'Lantern' # 图片浏览器 pod 'WechatOpenSDK-XCFramework' # 微信开放平台组件 end