1.1.1文本滚动版本
This commit is contained in:
parent
5f9a43eafd
commit
45455e7c6d
3
Podfile
3
Podfile
@ -27,5 +27,6 @@ pod 'MJRefresh'
|
||||
pod "DownloadButton"
|
||||
#下载框架
|
||||
pod 'Tiercel'
|
||||
|
||||
#文本跑马灯
|
||||
pod 'MarqueeLabel'
|
||||
end
|
||||
|
||||
@ -5,6 +5,7 @@ PODS:
|
||||
- JXPagingView/Paging (2.1.3)
|
||||
- JXSegmentedView (1.3.3)
|
||||
- Kingfisher (7.11.0)
|
||||
- MarqueeLabel (4.5.0)
|
||||
- MJRefresh (3.7.9)
|
||||
- SnapKit (5.7.1)
|
||||
- SVProgressHUD (2.3.1):
|
||||
@ -20,6 +21,7 @@ DEPENDENCIES:
|
||||
- JXPagingView/Paging
|
||||
- JXSegmentedView
|
||||
- Kingfisher
|
||||
- MarqueeLabel
|
||||
- MJRefresh
|
||||
- SnapKit
|
||||
- SVProgressHUD
|
||||
@ -34,6 +36,7 @@ SPEC REPOS:
|
||||
- JXPagingView
|
||||
- JXSegmentedView
|
||||
- Kingfisher
|
||||
- MarqueeLabel
|
||||
- MJRefresh
|
||||
- SnapKit
|
||||
- SVProgressHUD
|
||||
@ -47,12 +50,13 @@ SPEC CHECKSUMS:
|
||||
JXPagingView: afdd2e9af09c90160dd232b970d603cc6e7ddd0e
|
||||
JXSegmentedView: 651b60fcf705258ba9395edd53876dbd2853fb68
|
||||
Kingfisher: b9c985d864d43515f404f1ef4a8ce7d802ace3ac
|
||||
MarqueeLabel: 4b46d196abd253448e830cbd976f9eacc3af0849
|
||||
MJRefresh: ff9e531227924c84ce459338414550a05d2aea78
|
||||
SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a
|
||||
SVProgressHUD: 4837c74bdfe2e51e8821c397825996a8d7de6e22
|
||||
SwiftDate: 72d28954e8e1c6c1c0f917ccc8005e4f83c7d4b2
|
||||
Tiercel: c0a73f876a72800333b15f4e7e48791f4ad21e90
|
||||
|
||||
PODFILE CHECKSUM: 436104abc66aacc2c16f90adefe5230845e81453
|
||||
PODFILE CHECKSUM: 0dbe586b5221e955924da76b16705e9638055ea1
|
||||
|
||||
COCOAPODS: 1.15.2
|
||||
|
||||
6
Pods/Manifest.lock
generated
6
Pods/Manifest.lock
generated
@ -5,6 +5,7 @@ PODS:
|
||||
- JXPagingView/Paging (2.1.3)
|
||||
- JXSegmentedView (1.3.3)
|
||||
- Kingfisher (7.11.0)
|
||||
- MarqueeLabel (4.5.0)
|
||||
- MJRefresh (3.7.9)
|
||||
- SnapKit (5.7.1)
|
||||
- SVProgressHUD (2.3.1):
|
||||
@ -20,6 +21,7 @@ DEPENDENCIES:
|
||||
- JXPagingView/Paging
|
||||
- JXSegmentedView
|
||||
- Kingfisher
|
||||
- MarqueeLabel
|
||||
- MJRefresh
|
||||
- SnapKit
|
||||
- SVProgressHUD
|
||||
@ -34,6 +36,7 @@ SPEC REPOS:
|
||||
- JXPagingView
|
||||
- JXSegmentedView
|
||||
- Kingfisher
|
||||
- MarqueeLabel
|
||||
- MJRefresh
|
||||
- SnapKit
|
||||
- SVProgressHUD
|
||||
@ -47,12 +50,13 @@ SPEC CHECKSUMS:
|
||||
JXPagingView: afdd2e9af09c90160dd232b970d603cc6e7ddd0e
|
||||
JXSegmentedView: 651b60fcf705258ba9395edd53876dbd2853fb68
|
||||
Kingfisher: b9c985d864d43515f404f1ef4a8ce7d802ace3ac
|
||||
MarqueeLabel: 4b46d196abd253448e830cbd976f9eacc3af0849
|
||||
MJRefresh: ff9e531227924c84ce459338414550a05d2aea78
|
||||
SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a
|
||||
SVProgressHUD: 4837c74bdfe2e51e8821c397825996a8d7de6e22
|
||||
SwiftDate: 72d28954e8e1c6c1c0f917ccc8005e4f83c7d4b2
|
||||
Tiercel: c0a73f876a72800333b15f4e7e48791f4ad21e90
|
||||
|
||||
PODFILE CHECKSUM: 436104abc66aacc2c16f90adefe5230845e81453
|
||||
PODFILE CHECKSUM: 0dbe586b5221e955924da76b16705e9638055ea1
|
||||
|
||||
COCOAPODS: 1.15.2
|
||||
|
||||
14
Pods/MarqueeLabel/LICENSE
generated
Normal file
14
Pods/MarqueeLabel/LICENSE
generated
Normal file
@ -0,0 +1,14 @@
|
||||
Copyright (c) 2011-2017 Charles Powell
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
||||
documentation files (the "Software"), to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
|
||||
to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
||||
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
IN THE SOFTWARE.
|
||||
167
Pods/MarqueeLabel/README.mdown
generated
Normal file
167
Pods/MarqueeLabel/README.mdown
generated
Normal file
@ -0,0 +1,167 @@
|
||||
Overview
|
||||
============
|
||||
|
||||
MarqueeLabel is a UILabel subclass adds a scrolling marquee effect when the text of the label outgrows the available width. The label scrolling direction and speed/rate can be specified as well. All standard UILabel properties (where it makes sense) are available in MarqueeLabel, with the intent of MarqueeLabel behaving just like a UILabel.
|
||||
|
||||
**MarqueeLabel will be maintained in Swift _only_ starting with [release 4.0](https://github.com/cbpowell/MarqueeLabel/releases/tag/4.0.0)!**
|
||||
|
||||
MarqueeLabel is compatible with both iOS and tvOS, and currently works with Swift 5.0 and the iOS 12.2 SDK! (But if you're looking for prior version Swift compatibility, [you can check the older releases](https://github.com/cbpowell/MarqueeLabel/releases/))
|
||||
|
||||
|
||||
|
||||
## Check it out!
|
||||

|
||||
|
||||
## How To Get Started
|
||||
|
||||
1. Clone MarqueeLabel from GitHub, and check out the demo project.
|
||||
2. Read through the documentation embedded in the [`MarqueeLabel.swift` source](https://github.com/cbpowell/MarqueeLabel/blob/master/Sources/MarqueeLabel.swift).
|
||||
3. Take a look at the [special notes](https://github.com/cbpowell/MarqueeLabel/blob/master/README.mdown#special-notes) section to be aware of any gotchas.
|
||||
4. Drop in MarqueeLabel as a replacement to your lengthy UILabels!
|
||||
5. Help out with bug fixes and new features.
|
||||
|
||||
### Installation
|
||||
#### [CocoaPods](http://cocoapods.org)
|
||||
|
||||
To use MarqueeLabel in a project, add the following to your project's Podfile:
|
||||
```ruby
|
||||
pod 'MarqueeLabel'
|
||||
```
|
||||
|
||||
#### Carthage
|
||||
|
||||
Add the following to your project's Cartfile:
|
||||
```ruby
|
||||
github "cbpowell/MarqueeLabel"
|
||||
```
|
||||
|
||||
#### Manual Installation
|
||||
|
||||
1. Add MarqueeLabel.swift, to your project.
|
||||
2. Add **QuartzCore.framework** to your project frameworks.
|
||||
3. Import MarqueeLabel and replace your UILabels with MarqueeLabels as needed.
|
||||
|
||||
|
||||
#### Using MarqueeLabel in your own Swift Framework?
|
||||
|
||||
See the [Special Note below](https://github.com/cbpowell/MarqueeLabel/blob/master/README.mdown#swiftframeworkusage) on supporting Cocoapods and Carthage simultaneously in a Swift framework!
|
||||
|
||||
## Usage
|
||||
|
||||
MarqueeLabel automatically scrolls its text, at either a defined rate (points per second) or over a duration (seconds), whenever the length of the label's text exceeds the space available given the label's frame.
|
||||
|
||||
There are several options for the Marquee type, and the default is `Continuous` (which looks just like what Apple typically uses). The animation curve of this scroll can be defined, and defaults to `UIViewAnimationOptionCurveLinear`.
|
||||
|
||||
There are also several optional features to help with your integration of the scrolling nature of MarqueeLabel:
|
||||
- An optional edge fade at the left and right edges of the view, in order to fade the label text into the background rather than simply being clipped off
|
||||
- Leading and trailing buffers to offset the label text inside its frame, giving you better control over alignment
|
||||
- "Labelization" to make your MarqueeLabel _exactly_ like a UILabel.
|
||||
- Scroll animation "holding" and pausing
|
||||
|
||||
See the included demo project for several use case examples!
|
||||
|
||||
|
||||
### Code
|
||||
These lines of code create a MarqueeLabel that will scroll across its content in 8.0 seconds, and adds 10.0 point long fade at the left and right boundaries.
|
||||
|
||||
Replace:
|
||||
|
||||
var lengthyLabel = UILabel.init(frame:aFrame)
|
||||
|
||||
With:
|
||||
|
||||
var lengthyLabel = MarqueeLabel.init(frame: aFrame, duration: 8.0, fadeLength: 10.0)
|
||||
|
||||
### Storyboards
|
||||
If you're using Storyboards/Interface Builder you can create a MarqueeLabel instance by adding a normal UILabel view to your Storyboard, and then manually changing the view's class to `MarqueeLabel` in the "Custom Class" field of the Identity Inspector tab on the Utilities panel (the right-side panel).
|
||||
_Note:_ If you forget to change the Custom Class field to `MarqueeLabel` and then try to access/set MarqueeLabel-specific properties in your code, you will get crashes!
|
||||
|
||||
<img src="Metadata/Storyboards_config.png" width="300">
|
||||
|
||||
You can then configure the normal UILabel properties, as well as most of the MarqueeLabel configuration properties, via the Attributes tab of the Utility panel!
|
||||
|
||||
### Even More
|
||||
|
||||
Check out the [MarqueeLabel documentation](http://cocoadocs.org/docsets/MarqueeLabel/) for more about all the features, including:
|
||||
- Bulk-manipulation class methods to conveniently restart, pause, and unpause all labels in a view controller
|
||||
- Scrolling direction: left->right, right->left, and continuous looping (both left and right)
|
||||
|
||||
## Extras
|
||||
|
||||
Also check out [the Extras folder](/Extras), a collection of subclasses, extensions, and modifications for MarqueeLabel to implement various functionality that has been requested or suggested, but not merged into the MarqueeLabel code.
|
||||
|
||||
|
||||
## Special Notes<a id="specialnotes"></a>
|
||||
|
||||
#### Automatic Font Size Adjustment
|
||||
|
||||
Starting with release 4.1, MarqueeLabel allows setting the [`adjustsFontSizeToWidth`](https://developer.apple.com/documentation/uikit/uilabel/1620546-adjustsfontsizetofitwidth) to `true`. When configured this way, MarqueeLabel will check to see if the text string
|
||||
(non-attributed or attributed) will fit within the frame when adjusted to the specified minimum scale factor, and:
|
||||
|
||||
- if the text will fit at the adjusted scale without requiring truncation, the label will **not scroll**. Instead, the label text will be allowed to adjust to that size and will remain static.
|
||||
- if the text will not fit, the label will scroll and retain the unscaled font size (i.e., like all releases prior to 4.1)
|
||||
|
||||
Previously MarqueeLabel would override any attempts to set `adjustsFontSizetoWidth` and `minimumScaleFactor` to the default settings used by UILabel (`false`, and `0.0`, respectively). As such the default behavior remains the same: the label will not adjust it's font size to 'avoid' scrolling.
|
||||
|
||||
#### IBDesignables
|
||||
|
||||
MarqueeLabel includes support for IBInspectable and IBDesignable, to allow configuration of the label inside Interface Builder/Storyboards. However, if you see these warnings when building:
|
||||
|
||||
IB Designables: Failed to update auto layout status: Failed to load designables from path (null)
|
||||
IB Designables: Failed to render instance of MarqueeLabel: Failed to load designables from path (null)
|
||||
|
||||
...then you are likely using MarqueeLabel as a static library, which does not support IBInspectable/IBDesignable. Some workarounds include:
|
||||
|
||||
- Install MarqueeLabel as a dynamic framework using CocoaPods with use_frameworks! in your Podfile
|
||||
- Install MarqueeLabel with Carthage
|
||||
- Install MarqueeLabel by manually importing the source files into your project (may be only option if you're targeting iOS 7.0)
|
||||
|
||||
#### Automatic Scrolling
|
||||
|
||||
MarqueeLabel tries its best to automatically begin scrolling when appropriate, but sometimes the way your view/view controller appears onscreen can trip it up.
|
||||
|
||||
To combat this, you can try:
|
||||
- Using the `restartLabel` instance method to manually start scrolling on a MarqueeLabel
|
||||
- Try using the bulk manipulation class methods - but note that these don't currently play well with UIViewController containment. You'll need to pass them the lowest UIViewController in your hierarchy.
|
||||
|
||||
#### Use in UITableView and UICollectionView
|
||||
|
||||
As noted above, MarqueeLabel can sometimes have trouble detecting when the scroll animation should start when used in UITableViews and UICollectionViews - although recent reviews have improved this.
|
||||
|
||||
Usually you'll configure the MarqueeLabel instance when building the cell in `tableView:cellForRowAtIndexPath:` (or similar for UICollectionView), but at this point the cell is not onscreen so MarqueeLabel will not begin the scrolling animation. Even when the cell is eventually placed onscreen as the user scrolls, due to timing it's possible that the animation will not fire.
|
||||
|
||||
To make sure the scrolling animation _does_ begin as the cell scrolls onscreen, you can use the the `restartLabel` method on your MarqueeLabels inside the `tableView:willDisplayCell:forRowAtIndexPath:` delegate method (or similar for UICollectionView).
|
||||
|
||||
**That said** - the UITableView/UICollectionView best practice is to minimize things like excessive animation, subviews, and custom drawing in your cells, in order to get glassy smooth scrolling. In general I would recommend against allowing your labels to automatically animate during user scrolling of the UITableView/UICollectionView. I suggest [holding scrolling](http://cocoadocs.org/docsets/MarqueeLabel/3.0.3/Classes/MarqueeLabel.html#//api/name/holdScrolling) or [labelizing](http://cocoadocs.org/docsets/MarqueeLabel/3.0.3/Classes/MarqueeLabel.html#//api/name/labelize) the labels while the user scrolls. See the table view example in the demo!
|
||||
|
||||
|
||||
#### Important Animation Note<a id="importantanimationnote"></a>
|
||||
MarqueeLabel is based on Core Animation, which does cause some problems when views appear and disappear and the repeating animation is stopped by iOS and does not automatically restart.
|
||||
|
||||
To address this, MarqueeLabel provides a few class methods that allow easy "restarting" of all MarqueeLabels associated with a UIViewController. Specifically, the class method `restartLabelsOfController:` should be called by your view controller (which passes in `self` for the `controller` parameter) when it is revealed or about to be revealed. Keep in mind that presenting a modal view controller can pause repeating UIView animations in the controller that is being covered!
|
||||
|
||||
`controllerLabelsLabelize:` and `controllerLabelsAnimate:` are for convenience, allowing labelizing and re-animating all labels of a UIViewController. Labelizing can be useful for performance, such as labelizing all MarqueeLabels when a UITableView/UIScrollView starts scrolling.
|
||||
|
||||
```swift
|
||||
override func viewDidAppear(_ animated: Bool) {
|
||||
super.viewDidAppear(animated)
|
||||
MarqueeLabel.controllerViewDidAppear(self)
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Todo
|
||||
- Ideas?
|
||||
|
||||
## About
|
||||
|
||||
Charles Powell
|
||||
- [GitHub](http://github.com/cbpowell)
|
||||
- [Twitter](http://twitter.com/seventhcolumn)
|
||||
|
||||
<a href="https://www.buymeacoffee.com/cbpowell" target="_blank"><img src="https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png" alt="Buy Me A Coffee" style="height: 41px !important;width: 174px !important;box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;-webkit-box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;" ></a>
|
||||
|
||||
Give me a shout if you're using this in your project!
|
||||
2096
Pods/MarqueeLabel/Sources/MarqueeLabel.swift
generated
Normal file
2096
Pods/MarqueeLabel/Sources/MarqueeLabel.swift
generated
Normal file
File diff suppressed because it is too large
Load Diff
14
Pods/MarqueeLabel/Sources/PrivacyInfo.xcprivacy
generated
Normal file
14
Pods/MarqueeLabel/Sources/PrivacyInfo.xcprivacy
generated
Normal file
@ -0,0 +1,14 @@
|
||||
<?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>NSPrivacyTracking</key>
|
||||
<false/>
|
||||
<key>NSPrivacyTrackingDomains</key>
|
||||
<array/>
|
||||
<key>NSPrivacyAccessedAPITypes</key>
|
||||
<array/>
|
||||
<key>NSPrivacyCollectedDataTypes</key>
|
||||
<array/>
|
||||
</dict>
|
||||
</plist>
|
||||
4797
Pods/Pods.xcodeproj/project.pbxproj
generated
4797
Pods/Pods.xcodeproj/project.pbxproj
generated
File diff suppressed because it is too large
Load Diff
58
Pods/Pods.xcodeproj/xcuserdata/zhou.xcuserdatad/xcschemes/MarqueeLabel-MarqueeLabel.xcscheme
generated
Normal file
58
Pods/Pods.xcodeproj/xcuserdata/zhou.xcuserdatad/xcschemes/MarqueeLabel-MarqueeLabel.xcscheme
generated
Normal file
@ -0,0 +1,58 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1500"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "CBFB5A372F4DE9D4BC6B9ADA98B80BFE"
|
||||
BuildableName = "MarqueeLabel.bundle"
|
||||
BlueprintName = "MarqueeLabel-MarqueeLabel"
|
||||
ReferencedContainer = "container:Pods.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
58
Pods/Pods.xcodeproj/xcuserdata/zhou.xcuserdatad/xcschemes/MarqueeLabel.xcscheme
generated
Normal file
58
Pods/Pods.xcodeproj/xcuserdata/zhou.xcuserdatad/xcschemes/MarqueeLabel.xcscheme
generated
Normal file
@ -0,0 +1,58 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1500"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "C23DB88E45B0ED14F0C8827BE9C46C95"
|
||||
BuildableName = "MarqueeLabel.framework"
|
||||
BlueprintName = "MarqueeLabel"
|
||||
ReferencedContainer = "container:Pods.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@ -69,6 +69,16 @@
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
</dict>
|
||||
<key>MarqueeLabel-MarqueeLabel.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
</dict>
|
||||
<key>MarqueeLabel.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
</dict>
|
||||
<key>Pods-relax.offline.mp3.music.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
|
||||
26
Pods/Target Support Files/MarqueeLabel/MarqueeLabel-Info.plist
generated
Normal file
26
Pods/Target Support Files/MarqueeLabel/MarqueeLabel-Info.plist
generated
Normal file
@ -0,0 +1,26 @@
|
||||
<?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>CFBundleDevelopmentRegion</key>
|
||||
<string>${PODS_DEVELOPMENT_LANGUAGE}</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>${PRODUCT_NAME}</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>4.5.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>${CURRENT_PROJECT_VERSION}</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</plist>
|
||||
5
Pods/Target Support Files/MarqueeLabel/MarqueeLabel-dummy.m
generated
Normal file
5
Pods/Target Support Files/MarqueeLabel/MarqueeLabel-dummy.m
generated
Normal file
@ -0,0 +1,5 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
@interface PodsDummy_MarqueeLabel : NSObject
|
||||
@end
|
||||
@implementation PodsDummy_MarqueeLabel
|
||||
@end
|
||||
12
Pods/Target Support Files/MarqueeLabel/MarqueeLabel-prefix.pch
generated
Normal file
12
Pods/Target Support Files/MarqueeLabel/MarqueeLabel-prefix.pch
generated
Normal file
@ -0,0 +1,12 @@
|
||||
#ifdef __OBJC__
|
||||
#import <UIKit/UIKit.h>
|
||||
#else
|
||||
#ifndef FOUNDATION_EXPORT
|
||||
#if defined(__cplusplus)
|
||||
#define FOUNDATION_EXPORT extern "C"
|
||||
#else
|
||||
#define FOUNDATION_EXPORT extern
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
16
Pods/Target Support Files/MarqueeLabel/MarqueeLabel-umbrella.h
generated
Normal file
16
Pods/Target Support Files/MarqueeLabel/MarqueeLabel-umbrella.h
generated
Normal file
@ -0,0 +1,16 @@
|
||||
#ifdef __OBJC__
|
||||
#import <UIKit/UIKit.h>
|
||||
#else
|
||||
#ifndef FOUNDATION_EXPORT
|
||||
#if defined(__cplusplus)
|
||||
#define FOUNDATION_EXPORT extern "C"
|
||||
#else
|
||||
#define FOUNDATION_EXPORT extern
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
FOUNDATION_EXPORT double MarqueeLabelVersionNumber;
|
||||
FOUNDATION_EXPORT const unsigned char MarqueeLabelVersionString[];
|
||||
|
||||
15
Pods/Target Support Files/MarqueeLabel/MarqueeLabel.debug.xcconfig
generated
Normal file
15
Pods/Target Support Files/MarqueeLabel/MarqueeLabel.debug.xcconfig
generated
Normal file
@ -0,0 +1,15 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
|
||||
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MarqueeLabel
|
||||
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
|
||||
LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
|
||||
OTHER_LDFLAGS = $(inherited) -framework "QuartzCore" -framework "UIKit"
|
||||
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
|
||||
PODS_BUILD_DIR = ${BUILD_DIR}
|
||||
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
|
||||
PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
|
||||
PODS_ROOT = ${SRCROOT}
|
||||
PODS_TARGET_SRCROOT = ${PODS_ROOT}/MarqueeLabel
|
||||
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
|
||||
SKIP_INSTALL = YES
|
||||
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
|
||||
6
Pods/Target Support Files/MarqueeLabel/MarqueeLabel.modulemap
generated
Normal file
6
Pods/Target Support Files/MarqueeLabel/MarqueeLabel.modulemap
generated
Normal file
@ -0,0 +1,6 @@
|
||||
framework module MarqueeLabel {
|
||||
umbrella header "MarqueeLabel-umbrella.h"
|
||||
|
||||
export *
|
||||
module * { export * }
|
||||
}
|
||||
15
Pods/Target Support Files/MarqueeLabel/MarqueeLabel.release.xcconfig
generated
Normal file
15
Pods/Target Support Files/MarqueeLabel/MarqueeLabel.release.xcconfig
generated
Normal file
@ -0,0 +1,15 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
|
||||
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MarqueeLabel
|
||||
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
|
||||
LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
|
||||
OTHER_LDFLAGS = $(inherited) -framework "QuartzCore" -framework "UIKit"
|
||||
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
|
||||
PODS_BUILD_DIR = ${BUILD_DIR}
|
||||
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
|
||||
PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
|
||||
PODS_ROOT = ${SRCROOT}
|
||||
PODS_TARGET_SRCROOT = ${PODS_ROOT}/MarqueeLabel
|
||||
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
|
||||
SKIP_INSTALL = YES
|
||||
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
|
||||
24
Pods/Target Support Files/MarqueeLabel/ResourceBundle-MarqueeLabel-MarqueeLabel-Info.plist
generated
Normal file
24
Pods/Target Support Files/MarqueeLabel/ResourceBundle-MarqueeLabel-MarqueeLabel-Info.plist
generated
Normal file
@ -0,0 +1,24 @@
|
||||
<?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>CFBundleDevelopmentRegion</key>
|
||||
<string>${PODS_DEVELOPMENT_LANGUAGE}</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>${PRODUCT_NAME}</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>4.5.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -171,6 +171,23 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
|
||||
## MarqueeLabel
|
||||
|
||||
Copyright (c) 2011-2017 Charles Powell
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
||||
documentation files (the "Software"), to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
|
||||
to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
||||
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
IN THE SOFTWARE.
|
||||
|
||||
## SVProgressHUD
|
||||
|
||||
MIT License
|
||||
|
||||
@ -224,6 +224,29 @@ THE SOFTWARE.
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>Copyright (c) 2011-2017 Charles Powell
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
||||
documentation files (the "Software"), to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
|
||||
to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
||||
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
IN THE SOFTWARE.</string>
|
||||
<key>License</key>
|
||||
<string>MIT</string>
|
||||
<key>Title</key>
|
||||
<string>MarqueeLabel</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>MIT License
|
||||
|
||||
@ -6,6 +6,7 @@ ${BUILT_PRODUCTS_DIR}/JXPagingView/JXPagingView.framework
|
||||
${BUILT_PRODUCTS_DIR}/JXSegmentedView/JXSegmentedView.framework
|
||||
${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework
|
||||
${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework
|
||||
${BUILT_PRODUCTS_DIR}/MarqueeLabel/MarqueeLabel.framework
|
||||
${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework
|
||||
${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework
|
||||
${BUILT_PRODUCTS_DIR}/SwiftDate/SwiftDate.framework
|
||||
|
||||
@ -5,6 +5,7 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JXPagingView.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JXSegmentedView.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Kingfisher.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MarqueeLabel.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SVProgressHUD.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftDate.framework
|
||||
|
||||
@ -6,6 +6,7 @@ ${BUILT_PRODUCTS_DIR}/JXPagingView/JXPagingView.framework
|
||||
${BUILT_PRODUCTS_DIR}/JXSegmentedView/JXSegmentedView.framework
|
||||
${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework
|
||||
${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework
|
||||
${BUILT_PRODUCTS_DIR}/MarqueeLabel/MarqueeLabel.framework
|
||||
${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework
|
||||
${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework
|
||||
${BUILT_PRODUCTS_DIR}/SwiftDate/SwiftDate.framework
|
||||
|
||||
@ -5,6 +5,7 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JXPagingView.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JXSegmentedView.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Kingfisher.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MarqueeLabel.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SVProgressHUD.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftDate.framework
|
||||
|
||||
@ -183,6 +183,7 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/JXSegmentedView/JXSegmentedView.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/MarqueeLabel/MarqueeLabel.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/SwiftDate/SwiftDate.framework"
|
||||
@ -196,6 +197,7 @@ if [[ "$CONFIGURATION" == "Release" ]]; then
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/JXSegmentedView/JXSegmentedView.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/MarqueeLabel/MarqueeLabel.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/SwiftDate/SwiftDate.framework"
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
|
||||
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/DownloadButton" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView" "${PODS_CONFIGURATION_BUILD_DIR}/JXSegmentedView" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftDate" "${PODS_CONFIGURATION_BUILD_DIR}/Tiercel"
|
||||
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/DownloadButton" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView" "${PODS_CONFIGURATION_BUILD_DIR}/JXSegmentedView" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/MarqueeLabel" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftDate" "${PODS_CONFIGURATION_BUILD_DIR}/Tiercel"
|
||||
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
|
||||
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DownloadButton/DownloadButton.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView/JXPagingView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXSegmentedView/JXSegmentedView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftDate/SwiftDate.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Tiercel/Tiercel.framework/Headers"
|
||||
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DownloadButton/DownloadButton.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView/JXPagingView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXSegmentedView/JXSegmentedView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MarqueeLabel/MarqueeLabel.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftDate/SwiftDate.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Tiercel/Tiercel.framework/Headers"
|
||||
LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
|
||||
LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift
|
||||
OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics" -framework "Accelerate" -framework "Alamofire" -framework "CFNetwork" -framework "CoreGraphics" -framework "DownloadButton" -framework "Foundation" -framework "IQKeyboardManagerSwift" -framework "JXPagingView" -framework "JXSegmentedView" -framework "Kingfisher" -framework "MJRefresh" -framework "QuartzCore" -framework "SVProgressHUD" -framework "SnapKit" -framework "SwiftDate" -framework "Tiercel" -framework "UIKit" -weak_framework "Combine" -weak_framework "SwiftUI"
|
||||
OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics" -framework "Accelerate" -framework "Alamofire" -framework "CFNetwork" -framework "CoreGraphics" -framework "DownloadButton" -framework "Foundation" -framework "IQKeyboardManagerSwift" -framework "JXPagingView" -framework "JXSegmentedView" -framework "Kingfisher" -framework "MJRefresh" -framework "MarqueeLabel" -framework "QuartzCore" -framework "SVProgressHUD" -framework "SnapKit" -framework "SwiftDate" -framework "Tiercel" -framework "UIKit" -weak_framework "Combine" -weak_framework "SwiftUI"
|
||||
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
|
||||
PODS_BUILD_DIR = ${BUILD_DIR}
|
||||
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
|
||||
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/DownloadButton" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView" "${PODS_CONFIGURATION_BUILD_DIR}/JXSegmentedView" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftDate" "${PODS_CONFIGURATION_BUILD_DIR}/Tiercel"
|
||||
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/DownloadButton" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView" "${PODS_CONFIGURATION_BUILD_DIR}/JXSegmentedView" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/MarqueeLabel" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftDate" "${PODS_CONFIGURATION_BUILD_DIR}/Tiercel"
|
||||
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
|
||||
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DownloadButton/DownloadButton.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView/JXPagingView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXSegmentedView/JXSegmentedView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftDate/SwiftDate.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Tiercel/Tiercel.framework/Headers"
|
||||
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DownloadButton/DownloadButton.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXPagingView/JXPagingView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXSegmentedView/JXSegmentedView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MarqueeLabel/MarqueeLabel.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftDate/SwiftDate.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Tiercel/Tiercel.framework/Headers"
|
||||
LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
|
||||
LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift
|
||||
OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics" -framework "Accelerate" -framework "Alamofire" -framework "CFNetwork" -framework "CoreGraphics" -framework "DownloadButton" -framework "Foundation" -framework "IQKeyboardManagerSwift" -framework "JXPagingView" -framework "JXSegmentedView" -framework "Kingfisher" -framework "MJRefresh" -framework "QuartzCore" -framework "SVProgressHUD" -framework "SnapKit" -framework "SwiftDate" -framework "Tiercel" -framework "UIKit" -weak_framework "Combine" -weak_framework "SwiftUI"
|
||||
OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics" -framework "Accelerate" -framework "Alamofire" -framework "CFNetwork" -framework "CoreGraphics" -framework "DownloadButton" -framework "Foundation" -framework "IQKeyboardManagerSwift" -framework "JXPagingView" -framework "JXSegmentedView" -framework "Kingfisher" -framework "MJRefresh" -framework "MarqueeLabel" -framework "QuartzCore" -framework "SVProgressHUD" -framework "SnapKit" -framework "SwiftDate" -framework "Tiercel" -framework "UIKit" -weak_framework "Combine" -weak_framework "SwiftUI"
|
||||
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
|
||||
PODS_BUILD_DIR = ${BUILD_DIR}
|
||||
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
|
||||
|
||||
@ -235,6 +235,7 @@
|
||||
CBC81FBA2C3694990028143B /* MPPositive_HomeSinglesTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBC81FB92C3694990028143B /* MPPositive_HomeSinglesTableViewCell.swift */; };
|
||||
CBC81FBC2C3696230028143B /* MPPositive_HomeSingleCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBC81FBB2C3696230028143B /* MPPositive_HomeSingleCollectionViewCell.swift */; };
|
||||
CBD4570D2C2EC38400CE766D /* AppTrackingTransparency.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CBD4570C2C2EC38400CE766D /* AppTrackingTransparency.framework */; };
|
||||
CBD5CAFD2C3BE9A90001E315 /* MP_MarQueeLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD5CAFC2C3BE9A90001E315 /* MP_MarQueeLabel.swift */; };
|
||||
CBDAC60E2C2BE1B6008B8D34 /* MPPositive_ChooseNewPlayListTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBDAC60D2C2BE1B6008B8D34 /* MPPositive_ChooseNewPlayListTableViewCell.swift */; };
|
||||
CBF3AEDA2C255B1200947AFC /* MPPositive_PlayListsShowTypeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBF3AED92C255B1200947AFC /* MPPositive_PlayListsShowTypeView.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
@ -467,6 +468,7 @@
|
||||
CBC81FB92C3694990028143B /* MPPositive_HomeSinglesTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_HomeSinglesTableViewCell.swift; sourceTree = "<group>"; };
|
||||
CBC81FBB2C3696230028143B /* MPPositive_HomeSingleCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_HomeSingleCollectionViewCell.swift; sourceTree = "<group>"; };
|
||||
CBD4570C2C2EC38400CE766D /* AppTrackingTransparency.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppTrackingTransparency.framework; path = System/Library/Frameworks/AppTrackingTransparency.framework; sourceTree = SDKROOT; };
|
||||
CBD5CAFC2C3BE9A90001E315 /* MP_MarQueeLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_MarQueeLabel.swift; sourceTree = "<group>"; };
|
||||
CBDAC60D2C2BE1B6008B8D34 /* MPPositive_ChooseNewPlayListTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_ChooseNewPlayListTableViewCell.swift; sourceTree = "<group>"; };
|
||||
CBF3AED92C255B1200947AFC /* MPPositive_PlayListsShowTypeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_PlayListsShowTypeView.swift; sourceTree = "<group>"; };
|
||||
EE70E1FE424F9A64CCD389DD /* Pods-relax.offline.mp3.music.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-relax.offline.mp3.music.debug.xcconfig"; path = "Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
@ -656,6 +658,7 @@
|
||||
CBAFCA262C0A10500054500E /* MP_LocationManager.swift */,
|
||||
CBAFCA292C0A10500054500E /* MP_PlayerSlider.swift */,
|
||||
CBAFCA2A2C0A10500054500E /* MP_WebWork.swift */,
|
||||
CBD5CAFC2C3BE9A90001E315 /* MP_MarQueeLabel.swift */,
|
||||
CBAFCA2B2C0A10500054500E /* MPPositive_Debouncer.swift */,
|
||||
CBAFCA2C2C0A10500054500E /* MPSideA_MediaCenterManager.swift */,
|
||||
CBAFCA2D2C0A10500054500E /* MPSideA_VolumeManager.swift */,
|
||||
@ -1346,6 +1349,7 @@
|
||||
CBAFCB722C0A10500054500E /* MPPositive_SearchResultTypeShowView.swift in Sources */,
|
||||
CBAFCB872C0A10500054500E /* MPSideA_PrivacyViewController.swift in Sources */,
|
||||
CBAFCB2E2C0A10500054500E /* MPPositive_ArtistViewModel.swift in Sources */,
|
||||
CBD5CAFD2C3BE9A90001E315 /* MP_MarQueeLabel.swift in Sources */,
|
||||
CBAFCB652C0A10500054500E /* MPPositive_HomeListThirdCollectionViewCell.swift in Sources */,
|
||||
CBAFCB472C0A10500054500E /* MPPositive_LoveArtistsViewController.swift in Sources */,
|
||||
CBAFCAF62C0A10500054500E /* InstanceFromNib.swift in Sources */,
|
||||
@ -1671,9 +1675,9 @@
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1.1.0.1;
|
||||
CURRENT_PROJECT_VERSION = 1.1.1.1;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = 8DQD6BV6H9;
|
||||
DEVELOPMENT_TEAM = T93S37G27F;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = relax.offline.mp3.music/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = Musiclax;
|
||||
@ -1691,7 +1695,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.1.0;
|
||||
MARKETING_VERSION = 1.1.1;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = relax.offline.mp3.music;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
@ -1714,9 +1718,9 @@
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1.1.0.1;
|
||||
CURRENT_PROJECT_VERSION = 1.1.1.1;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = 8DQD6BV6H9;
|
||||
DEVELOPMENT_TEAM = T93S37G27F;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = relax.offline.mp3.music/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = Musiclax;
|
||||
@ -1734,7 +1738,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.1.0;
|
||||
MARKETING_VERSION = 1.1.1;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = relax.offline.mp3.music;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
{
|
||||
"originHash" : "c713d6dac9298f5a58527d975ef56b86c962e56b989f7f618c7fd350cd12ac74",
|
||||
"originHash" : "d444ada832b2e07cbfed67fc787e76d7499100a1c75497df596832a2bef88ae9",
|
||||
"pins" : [
|
||||
{
|
||||
"identity" : "abseil-cpp-binary",
|
||||
|
||||
@ -87,43 +87,43 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||
if UserDefaults.standard.string(forKey: "OpenICEID") == nil {
|
||||
print("第一次启动,添加广告ID")
|
||||
//存入默认开屏冷启动广告ID
|
||||
UserDefaults.standard.set("ca-app-pub-1371732277241593/1926543650", forKey: "OpenICEID")
|
||||
}
|
||||
UserDefaults.standard.set("ca-app-pub-3940256099942544/5575463023", forKey: "OpenICEID")
|
||||
}
|
||||
if UserDefaults.standard.string(forKey: "OpenHOSTID") == nil {
|
||||
//存入默认开屏热启动广告ID
|
||||
UserDefaults.standard.set("ca-app-pub-1371732277241593/3299335073", forKey: "OpenHOSTID")
|
||||
UserDefaults.standard.set("ca-app-pub-3940256099942544/5575463023", forKey: "OpenHOSTID")
|
||||
}
|
||||
if UserDefaults.standard.string(forKey: "SearchINSERTID") == nil {
|
||||
//存入默认搜索插页广告ID
|
||||
UserDefaults.standard.set("ca-app-pub-1371732277241593/8622500865", forKey: "SearchINSERTID")
|
||||
UserDefaults.standard.set("ca-app-pub-3940256099942544/4411468910", forKey: "SearchINSERTID")
|
||||
}
|
||||
if UserDefaults.standard.string(forKey: "SearchNATIVEID") == nil {
|
||||
//存入默认搜索原生广告ID
|
||||
UserDefaults.standard.set("ca-app-pub-1371732277241593/5674216970", forKey: "SearchNATIVEID")
|
||||
}
|
||||
UserDefaults.standard.set("ca-app-pub-3940256099942544/3986624511", forKey: "SearchNATIVEID")
|
||||
}
|
||||
if UserDefaults.standard.string(forKey: "PlayerINSERTID") == nil {
|
||||
//存入默认播放插页广告ID
|
||||
UserDefaults.standard.set("ca-app-pub-1371732277241593/4182802216", forKey: "PlayerINSERTID")
|
||||
UserDefaults.standard.set("ca-app-pub-3940256099942544/4411468910", forKey: "PlayerINSERTID")
|
||||
}
|
||||
if UserDefaults.standard.string(forKey: "SwitchINSERTID") == nil {
|
||||
//存入默认切歌插页广告ID
|
||||
UserDefaults.standard.set("ca-app-pub-1371732277241593/8439981117", forKey: "SwitchINSERTID")
|
||||
}
|
||||
UserDefaults.standard.set("ca-app-pub-3940256099942544/4411468910", forKey: "SwitchINSERTID")
|
||||
}
|
||||
if UserDefaults.standard.string(forKey: "LoadINSERTID") == nil {
|
||||
//存入默认下载插页广告ID
|
||||
UserDefaults.standard.set("ca-app-pub-1371732277241593/3107763383", forKey: "LoadINSERTID")
|
||||
UserDefaults.standard.set("ca-app-pub-3940256099942544/4411468910", forKey: "LoadINSERTID")
|
||||
}
|
||||
if UserDefaults.standard.string(forKey: "LibraryINSERTID") == nil {
|
||||
//存入默认曲库插页ID
|
||||
UserDefaults.standard.set("ca-app-pub-1371732277241593/5298812459", forKey: "LibraryINSERTID")
|
||||
}
|
||||
UserDefaults.standard.set("ca-app-pub-3940256099942544/4411468910", forKey: "LibraryINSERTID")
|
||||
}
|
||||
if UserDefaults.standard.string(forKey: "LibraryNATIVEID") == nil {
|
||||
//存入默认曲库原生ID
|
||||
UserDefaults.standard.set("ca-app-pub-1371732277241593/4683255855", forKey: "LibraryNATIVEID")
|
||||
UserDefaults.standard.set("ca-app-pub-3940256099942544/3986624511", forKey: "LibraryNATIVEID")
|
||||
}
|
||||
if UserDefaults.standard.string(forKey: "GlobalINSERTID") == nil {
|
||||
//存入默认全局备用插页ID
|
||||
UserDefaults.standard.set("ca-app-pub-1371732277241593/9449223728", forKey: "GlobalINSERTID")
|
||||
UserDefaults.standard.set("ca-app-pub-3940256099942544/4411468910", forKey: "GlobalINSERTID")
|
||||
}
|
||||
if UserDefaults.standard.string(forKey: "ClientVersion") == nil {
|
||||
UserDefaults.standard.set("1.20240618.01.00", forKey: "ClientVersion")
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
<string>fetch</string>
|
||||
</array>
|
||||
<key>GADApplicationIdentifier</key>
|
||||
<string>ca-app-pub-1371732277241593~3881310073</string>
|
||||
<string>ca-app-pub-3940256099942544~1458002511</string>
|
||||
<key>SKAdNetworkItems</key>
|
||||
<array>
|
||||
<dict>
|
||||
|
||||
@ -10,6 +10,7 @@ import AVFoundation
|
||||
import AppTrackingTransparency
|
||||
import AdSupport
|
||||
import MessageUI
|
||||
import MarqueeLabel
|
||||
@_exported import JXSegmentedView
|
||||
@_exported import JXPagingView
|
||||
//给JXPagingListContainerView添加extension,表示遵从JXSegmentedViewListContainer的协议
|
||||
@ -151,6 +152,19 @@ func createLabel(_ text:String? = nil, font:UIFont, textColor:UIColor, textAlign
|
||||
label.numberOfLines = lines
|
||||
return label
|
||||
}
|
||||
///创建一个支持跑马灯的label
|
||||
func createMarQueeLabel(_ text:String? = nil, font:UIFont, textColor:UIColor) -> MarqueeLabel {
|
||||
let label = MarqueeLabel(frame: .init(x: 0, y: 0, width: screen_Width, height: 30*width), duration: 10, fadeLength: 10)
|
||||
label.animationCurve = .linear
|
||||
label.text = text ?? "text"
|
||||
label.font = font
|
||||
label.textColor = textColor
|
||||
label.numberOfLines = 1
|
||||
label.type = .continuous
|
||||
label.restartLabel()
|
||||
return label
|
||||
}
|
||||
|
||||
///根据播放器状态将按钮的图片进行切换
|
||||
func switchPlayTypeBtnIcon(_ btn:UIButton) {
|
||||
switch MP_PlayerManager.shared.getPlayType() {
|
||||
|
||||
@ -11,20 +11,17 @@ class MPPositive_Debouncer: NSObject {
|
||||
static let shared = MPPositive_Debouncer()
|
||||
//计时器
|
||||
private var timer: Timer?
|
||||
//计时值
|
||||
private var delay: TimeInterval
|
||||
|
||||
private override init() {
|
||||
delay = 0.1
|
||||
super.init()
|
||||
}
|
||||
deinit {
|
||||
timer?.invalidate()
|
||||
timer = nil
|
||||
}
|
||||
func call(_ action:@escaping (() -> Void)) {
|
||||
func call(_ delay:TimeInterval = 0.15, action:@escaping (() -> Void)) {
|
||||
// 取消之前的延迟调用
|
||||
timer?.invalidate()
|
||||
timer = nil
|
||||
// 设置新的延迟调用
|
||||
timer = Timer.scheduledTimer(withTimeInterval: delay, repeats: false) { _ in
|
||||
action()
|
||||
|
||||
@ -14,7 +14,7 @@ class MP_AdMobManager: NSObject, GADFullScreenContentDelegate, GADNativeAdLoader
|
||||
static let shared = MP_AdMobManager()
|
||||
private let sharedInstance = GADMobileAds.sharedInstance()
|
||||
///广告总开关
|
||||
private var openAdStatus:Bool = true
|
||||
private var openAdStatus:Bool = false
|
||||
///广告过期时间(50分钟)
|
||||
private let expirationTime:TimeInterval = 3000
|
||||
|
||||
|
||||
@ -114,14 +114,14 @@ class MP_AnalyticsManager: NSObject {
|
||||
print("更新了插页广告时长间隔")
|
||||
}
|
||||
//更新广告ID设置
|
||||
if let content = self.remoteConfig.configValue(forKey: "adMobIDs").jsonValue as? [String:String] {
|
||||
//对所有广告ID进行更新
|
||||
for (key, value) in content {
|
||||
UserDefaults.standard.setValue(value, forKey: key)
|
||||
}
|
||||
print("更新了所有广告ID")
|
||||
MP_AdMobManager.shared.reloadAdMobIDs()
|
||||
}
|
||||
// if let content = self.remoteConfig.configValue(forKey: "adMobIDs").jsonValue as? [String:String] {
|
||||
// //对所有广告ID进行更新
|
||||
// for (key, value) in content {
|
||||
// UserDefaults.standard.setValue(value, forKey: key)
|
||||
// }
|
||||
// print("更新了所有广告ID")
|
||||
// MP_AdMobManager.shared.reloadAdMobIDs()
|
||||
// }
|
||||
//更新版本数据设置
|
||||
if let versionData = self.remoteConfig.configValue(forKey: "dataVersion").jsonValue as? [String:String] {
|
||||
//对数据进行更新
|
||||
|
||||
@ -76,7 +76,7 @@ class MP_DownloadManager: NSObject {
|
||||
//根据歌曲信息获得下载链接,并创建下载任务(允许压缩下载)
|
||||
guard let url = URL(string: song.resourceUrls?.first ?? ""), let videoId = song.videoId else {
|
||||
//获取链接失败
|
||||
MP_HUD.error("Download failed, please try again later!", delay: 2.0, completion: nil)
|
||||
MP_HUD.error("Source details not available yet, please try again later!", delay: 2.0, completion: nil)
|
||||
//失败事件埋点
|
||||
MP_AnalyticsManager.shared.player_b_downloadfailure_errorAction(song.videoId ?? "", videoname: song.title ?? "", artistname: song.shortBylineText ?? "", error: "Failed to create download link")
|
||||
return
|
||||
@ -223,7 +223,7 @@ class MP_DownloadManager: NSObject {
|
||||
//下载失败
|
||||
guard let self = self else {return}
|
||||
//确定任务报错是否存在
|
||||
if let error = task.error {
|
||||
if let error = task.error{
|
||||
//任务报错存在,处理完成状态回调
|
||||
NotificationCenter.notificationKey.post(notificationName: .dowload_end_source, object: ["videoId":nextVideoId])
|
||||
//发布报错埋点
|
||||
@ -235,7 +235,12 @@ class MP_DownloadManager: NSObject {
|
||||
downloadURLs[nextVideoId] = nil
|
||||
progressStorage[nextVideoId] = nil
|
||||
songHandlers[nextVideoId] = nil
|
||||
MP_HUD.text("An error occurred while downloading. Please download again.", delay: 1.5, completion: nil)
|
||||
switch error.localizedDescription {
|
||||
case "The operation couldn’t be completed. No space left on device":
|
||||
MP_HUD.text("Insufficient storage space, download failed", delay: 1.5, completion: nil)
|
||||
default:
|
||||
MP_HUD.text("An error occurred while downloading. Please download again.", delay: 1.5, completion: nil)
|
||||
}
|
||||
session.cancel(task) { _ in
|
||||
self.downloadTasks[nextVideoId] = nil
|
||||
print("\(self.songHandlers[nextVideoId]?.title ?? "")下载任务失败,失败原因:\(error)")
|
||||
|
||||
@ -0,0 +1,10 @@
|
||||
//
|
||||
// MP_MarQueeLabel.swift
|
||||
// relax.offline.mp3.music
|
||||
//
|
||||
// Created by Mr.Zhou on 2024/7/8.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import MarqueeLabel
|
||||
|
||||
@ -68,11 +68,11 @@ class MP_NetWorkManager: NSObject {
|
||||
private var playerVersion:String!
|
||||
///禁止接入IP信息组
|
||||
private let banIPs:[String] = [
|
||||
"CN",
|
||||
"HK",
|
||||
"TW",
|
||||
"JP",
|
||||
"KR"
|
||||
// "CN",
|
||||
// "HK",
|
||||
// "TW",
|
||||
// "JP",
|
||||
// "KR"
|
||||
]
|
||||
///允许访问的区域Code(对部分内容进行塞选)
|
||||
private let codes:[String] = [
|
||||
@ -1222,18 +1222,37 @@ extension MP_NetWorkManager {
|
||||
} else if let underlyingError = error?.underlyingError as? URLError {
|
||||
switch underlyingError.code {
|
||||
case .notConnectedToInternet:
|
||||
print("网络连接不可用,请检查你的网络设置。")
|
||||
print("网络连接不可用,请检查你的网络设置")
|
||||
MP_AnalyticsManager.shared.home_b_module_showfailure_errorAction("Network Unavailable, Error:\(underlyingError.localizedDescription)")
|
||||
case .timedOut:
|
||||
print("请求超时,请稍后重试。")
|
||||
print("请求超时,即将重启请求")
|
||||
MP_AnalyticsManager.shared.home_b_module_showfailure_errorAction("Timed Out, Error:\(underlyingError.localizedDescription)")
|
||||
MPPositive_BrowseLoadViewModel.shared.reloadBrowseLists()
|
||||
return
|
||||
case .networkConnectionLost:
|
||||
print("网络权限开启,但网络本身不可用,请检查你的网络设置")
|
||||
MP_AnalyticsManager.shared.home_b_module_showfailure_errorAction("International comics not yet launched, Error:\(underlyingError.localizedDescription)")
|
||||
case .cannotLoadFromNetwork:
|
||||
print("请求证书失效,即将重启请求")
|
||||
MP_AnalyticsManager.shared.home_b_module_showfailure_errorAction("SSL Error, Error:\(underlyingError.localizedDescription)")
|
||||
MPPositive_BrowseLoadViewModel.shared.reloadBrowseLists()
|
||||
return
|
||||
case .cannotConnectToHost:
|
||||
print("服务器响应失败,请待会儿调用")
|
||||
MP_AnalyticsManager.shared.home_b_module_showfailure_errorAction("Server not present, Error:\(underlyingError.localizedDescription)")
|
||||
case .badURL:
|
||||
print("链接失败,即将重启请求")
|
||||
MP_AnalyticsManager.shared.home_b_module_showfailure_errorAction("Bad URL, Error:\(underlyingError.localizedDescription)")
|
||||
MPPositive_BrowseLoadViewModel.shared.reloadBrowseLists()
|
||||
return
|
||||
case .cannotDecodeContentData:
|
||||
print("解析响应体失败,即将重启请求")
|
||||
MP_AnalyticsManager.shared.home_b_module_showfailure_errorAction("Can't Decode Content Data, Error:\(underlyingError.localizedDescription)")
|
||||
MPPositive_BrowseLoadViewModel.shared.reloadBrowseLists()
|
||||
return
|
||||
default:
|
||||
print("NSURL 错误,错误码: \(underlyingError.code.rawValue)。")
|
||||
MP_AnalyticsManager.shared.home_b_module_showfailure_errorAction("Request Error, Error:\(underlyingError.localizedDescription)")
|
||||
MPPositive_BrowseLoadViewModel.shared.reloadBrowseLists()
|
||||
return
|
||||
}
|
||||
} else {
|
||||
print("未知错误: \(error?.localizedDescription ?? "")")
|
||||
|
||||
@ -272,7 +272,7 @@ class MP_PlayerManager:NSObject{
|
||||
/// - runAction: 播放途中需要执行的事件
|
||||
/// - endAction: 结束播放时需要执行的事件
|
||||
func play(startAction:MP_PlayTimerStartAction? = nil) {
|
||||
guard loadPlayer != nil, loadPlayer.currentVideo != nil else {
|
||||
guard loadPlayer != nil, loadPlayer?.currentVideo != nil else {
|
||||
//当两项数据皆为空时,播放器无法播放
|
||||
print("Player No Data")
|
||||
return
|
||||
@ -298,7 +298,7 @@ class MP_PlayerManager:NSObject{
|
||||
//启动计时器
|
||||
startTimer()
|
||||
//对当前播放PlayerItem设置监听状态
|
||||
if loadPlayer.currentVideo?.isKVO == false {
|
||||
if loadPlayer?.currentVideo?.isKVO == false {
|
||||
//准备状态
|
||||
statusObservation?.invalidate()
|
||||
statusObservation = loadPlayer?.currentVideo?.resourcePlayerItem?.observe(\.status, options: [.old,.new], changeHandler: { [weak self] item, change in
|
||||
@ -310,13 +310,13 @@ class MP_PlayerManager:NSObject{
|
||||
print("当前音乐-\(loadPlayer?.currentVideo?.title ?? "") 已经准备好播放")
|
||||
}
|
||||
}else {
|
||||
print("当前音乐-\(loadPlayer.currentVideo?.title ?? "") 未做好准备播放,失败原因是\(loadPlayer.currentVideo?.resourcePlayerItem.error?.localizedDescription ?? "")")
|
||||
MP_AnalyticsManager.shared.player_b_failure_errorAction(loadPlayer?.currentVideo?.song.videoId ?? "", videoname: loadPlayer?.currentVideo?.title ?? "", artistname: loadPlayer?.currentVideo?.song.shortBylineText ?? "", error: loadPlayer.currentVideo?.resourcePlayerItem.error?.localizedDescription ?? "Failed to buffer data")
|
||||
print("当前音乐-\(loadPlayer?.currentVideo?.title ?? "") 未做好准备播放,失败原因是\(loadPlayer?.currentVideo?.resourcePlayerItem.error?.localizedDescription ?? "")")
|
||||
MP_AnalyticsManager.shared.player_b_failure_errorAction(loadPlayer?.currentVideo?.song.videoId ?? "", videoname: loadPlayer?.currentVideo?.title ?? "", artistname: loadPlayer?.currentVideo?.song.shortBylineText ?? "", error: loadPlayer?.currentVideo?.resourcePlayerItem.error?.localizedDescription ?? "Failed to buffer data")
|
||||
if loadPlayer?.currentVideo?.isKVO == true {
|
||||
suspendTimer()
|
||||
loadPlayer?.currentVideo?.isKVO = false
|
||||
//重新配置数据
|
||||
loadPlayer.remakeImproveData {
|
||||
loadPlayer?.remakeImproveData {
|
||||
[weak self] in
|
||||
self?.play()
|
||||
}
|
||||
@ -364,7 +364,7 @@ class MP_PlayerManager:NSObject{
|
||||
MP_AnalyticsManager.shared.player_b_failure_errorAction(loadPlayer?.currentVideo?.song.videoId ?? "", videoname: loadPlayer?.currentVideo?.title ?? "", artistname: loadPlayer?.currentVideo?.song.shortBylineText ?? "", error: nsError.localizedDescription)
|
||||
}
|
||||
})
|
||||
loadPlayer.currentVideo.isKVO = true
|
||||
loadPlayer?.currentVideo?.isKVO = true
|
||||
//将进度回归为0
|
||||
player.seek(to: .zero)
|
||||
updateNowPlayingInfo()
|
||||
@ -577,11 +577,11 @@ class MP_PlayerManager:NSObject{
|
||||
if nextIndex < 0 {
|
||||
//播放列表最后一首
|
||||
let last = loadPlayer?.randomVideos?.last
|
||||
loadPlayer.improveData(last?.videoId ?? "", isRandom: true)
|
||||
loadPlayer?.improveData(last?.videoId ?? "", isRandom: true)
|
||||
}else {
|
||||
//查询列表对应单曲
|
||||
if let song = loadPlayer?.randomVideos?[nextIndex] {
|
||||
loadPlayer.improveData(song.videoId ?? "", isRandom: true)
|
||||
loadPlayer?.improveData(song.videoId ?? "", isRandom: true)
|
||||
}
|
||||
}
|
||||
default://常规播放或者单曲播放
|
||||
@ -601,11 +601,11 @@ class MP_PlayerManager:NSObject{
|
||||
if nextIndex < 0 {
|
||||
//播放列表最后一首
|
||||
let last = loadPlayer?.songVideos?.last
|
||||
loadPlayer.improveData(last?.videoId ?? "")
|
||||
loadPlayer?.improveData(last?.videoId ?? "")
|
||||
}else {
|
||||
//查询列表对应单曲
|
||||
if let song = loadPlayer?.songVideos?[nextIndex] {
|
||||
loadPlayer.improveData(song.videoId ?? "")
|
||||
loadPlayer?.improveData(song.videoId ?? "")
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -617,51 +617,51 @@ class MP_PlayerManager:NSObject{
|
||||
var nextIndex:Int = 0
|
||||
switch playType {
|
||||
case .random:
|
||||
guard (loadPlayer?.randomVideos?.count ?? 0) != 1 else {
|
||||
guard let randomVideos = loadPlayer?.randomVideos, randomVideos.count != 1 else {
|
||||
player.seek(to: .zero)
|
||||
playState = .Playing
|
||||
player.play()
|
||||
return
|
||||
}
|
||||
for (index, item) in (loadPlayer?.randomVideos ?? []).enumerated() {
|
||||
for (index, item) in randomVideos.enumerated() {
|
||||
if item.videoId == loadPlayer?.currentVideo?.song.videoId {
|
||||
//找到播放音乐的索引
|
||||
nextIndex = index + 1
|
||||
}
|
||||
}
|
||||
//超出播放列表数
|
||||
if nextIndex > ((loadPlayer?.randomVideos?.count ?? 0)-1) {
|
||||
if nextIndex > (randomVideos.count-1) {
|
||||
//播放列表第一首
|
||||
let first = loadPlayer?.randomVideos?.first
|
||||
loadPlayer.improveData(first?.videoId ?? "", isRandom: true)
|
||||
let first = randomVideos.first
|
||||
loadPlayer?.improveData(first?.videoId ?? "", isRandom: true)
|
||||
}else {
|
||||
//存在下一首,获取下一首ID,并播放
|
||||
if let song = loadPlayer?.randomVideos?[nextIndex] {
|
||||
loadPlayer.improveData(song.videoId ?? "", isRandom: true)
|
||||
loadPlayer?.improveData(song.videoId ?? "", isRandom: true)
|
||||
}
|
||||
}
|
||||
default:
|
||||
guard (loadPlayer?.songVideos?.count ?? 0) != 1 else {
|
||||
guard let songVideos = loadPlayer.songVideos, songVideos.count != 1 else {
|
||||
player.seek(to: .zero)
|
||||
playState = .Playing
|
||||
player.play()
|
||||
return
|
||||
}
|
||||
for (index, item) in (loadPlayer?.songVideos ?? []).enumerated() {
|
||||
for (index, item) in songVideos.enumerated() {
|
||||
if item.videoId == loadPlayer?.currentVideo?.song.videoId {
|
||||
//找到播放音乐的索引
|
||||
nextIndex = index + 1
|
||||
}
|
||||
}
|
||||
//超出播放列表数
|
||||
if nextIndex > (loadPlayer?.songVideos?.count ?? 0)-1 {
|
||||
if nextIndex > (songVideos.count-1) {
|
||||
//播放列表第一首
|
||||
let first = loadPlayer?.songVideos?.first
|
||||
loadPlayer.improveData(first?.videoId ?? "")
|
||||
let first = songVideos.first
|
||||
loadPlayer?.improveData(first?.videoId ?? "")
|
||||
}else {
|
||||
//存在下一首,获取下一首ID,并播放
|
||||
if let song = loadPlayer?.songVideos?[nextIndex] {
|
||||
loadPlayer.improveData(song.videoId ?? "")
|
||||
loadPlayer?.improveData(song.videoId ?? "")
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -686,7 +686,7 @@ class MP_PlayerManager:NSObject{
|
||||
if cacheValueBlock != nil {
|
||||
cacheValueBlock!(0, 1)
|
||||
}
|
||||
if loadPlayer.currentVideo != nil {
|
||||
if loadPlayer?.currentVideo != nil {
|
||||
//开始播放
|
||||
play(startAction: startActionBlock)
|
||||
}
|
||||
@ -800,7 +800,7 @@ class MP_PlayerManager:NSObject{
|
||||
//设置歌曲时长
|
||||
currentInfo![MPMediaItemPropertyPlaybackDuration] = CMTimeGetSeconds(player.currentItem?.duration ?? .zero)
|
||||
currentInfo![MPNowPlayingInfoPropertyPlaybackRate] = 1.0
|
||||
let reviewURL = URL(string: loadPlayer.currentVideo?.song?.reviewUrls?.last ?? "")!
|
||||
let reviewURL = URL(string: loadPlayer?.currentVideo?.song?.reviewUrls?.last ?? "")!
|
||||
KingfisherManager.shared.retrieveImage(with: reviewURL) { [weak self]result in
|
||||
switch result {
|
||||
case .success(let imageResult):
|
||||
|
||||
@ -198,69 +198,12 @@ struct JsonBrowses: Codable {
|
||||
struct Run: Codable {
|
||||
///关键文本内容(代表各级标题)
|
||||
let text:String?
|
||||
///指向预览ID
|
||||
let navigationEndpoint: NavigationEndpoint?
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case text = "text"
|
||||
case navigationEndpoint = "navigationEndpoint"
|
||||
}
|
||||
init(from decoder: Decoder) throws {
|
||||
let values = try decoder.container(keyedBy: CodingKeys.self)
|
||||
text = try values.decodeIfPresent(String.self, forKey: .text)
|
||||
navigationEndpoint = try values.decodeIfPresent(NavigationEndpoint.self, forKey: .navigationEndpoint)
|
||||
}
|
||||
struct NavigationEndpoint: Codable {
|
||||
let browseEndpoint:BrowseEndpoint?
|
||||
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case browseEndpoint = "browseEndpoint"
|
||||
}
|
||||
init(from decoder: Decoder) throws {
|
||||
let values = try decoder.container(keyedBy: CodingKeys.self)
|
||||
browseEndpoint = try values.decodeIfPresent(BrowseEndpoint.self, forKey: .browseEndpoint)
|
||||
|
||||
}
|
||||
//MARK: - 展示内容块的预览内容
|
||||
struct BrowseEndpoint: Codable {
|
||||
///预览ID(作者/歌单/专辑都有,关键内容)
|
||||
let browseId:String?
|
||||
///预览参数(作者/歌单/专辑具备,关键内容)
|
||||
let params:String?
|
||||
///指向预览类型
|
||||
let browseEndpointContextSupportedConfigs:BrowseEndpointContextSupportedConfigs?
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case browseId = "browseId"
|
||||
case params = "params"
|
||||
case browseEndpointContextSupportedConfigs = "browseEndpointContextSupportedConfigs"
|
||||
}
|
||||
init(from decoder: Decoder) throws {
|
||||
let values = try decoder.container(keyedBy: CodingKeys.self)
|
||||
browseId = try values.decodeIfPresent(String.self, forKey: .browseId)
|
||||
params = try values.decodeIfPresent(String.self, forKey: .params)
|
||||
browseEndpointContextSupportedConfigs = try values.decodeIfPresent(BrowseEndpointContextSupportedConfigs.self, forKey: .browseEndpointContextSupportedConfigs)
|
||||
}
|
||||
struct BrowseEndpointContextSupportedConfigs: Codable {
|
||||
let browseEndpointContextMusicConfig:BrowseEndpointContextMusicConfig?
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case browseEndpointContextMusicConfig = "browseEndpointContextMusicConfig"
|
||||
}
|
||||
init(from decoder: Decoder) throws {
|
||||
let values = try decoder.container(keyedBy: CodingKeys.self)
|
||||
browseEndpointContextMusicConfig = try values.decodeIfPresent(BrowseEndpointContextMusicConfig.self, forKey: .browseEndpointContextMusicConfig)
|
||||
}
|
||||
//MARK: - Browse类型 作者/歌单/专辑
|
||||
struct BrowseEndpointContextMusicConfig: Codable {
|
||||
let pageType:String?
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case pageType = "pageType"
|
||||
}
|
||||
init(from decoder: Decoder) throws {
|
||||
let values = try decoder.container(keyedBy: CodingKeys.self)
|
||||
pageType = try values.decodeIfPresent(String.self, forKey: .pageType)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -72,7 +72,11 @@ class MPPositive_BaseViewController: MP_BaseViewController, UIGestureRecognizerD
|
||||
}
|
||||
//pop上一个页面
|
||||
@objc func popActionClick(_ sender:UIButton) {
|
||||
navigationController?.popViewController(animated: true)
|
||||
MPPositive_Debouncer.shared.call {
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
navigationController?.popViewController(animated: true)
|
||||
}
|
||||
}
|
||||
//报错errorView
|
||||
private func createErrorView() -> UIView{
|
||||
|
||||
@ -110,6 +110,10 @@ extension MPPositive_TabBarController {
|
||||
let recommendVC = MPPositive_RecommendViewController(MP_PlayerManager.shared.loadPlayer?.currentVideo?.song.relatedID ?? "")
|
||||
self?.viewControllers![self?.selectedIndex ?? 0].children[0].navigationController?.pushViewController(recommendVC, animated: false)
|
||||
}
|
||||
playerVC.searchBlock = { (text) in
|
||||
let resultVC = MPPositive_SearchResultShowViewController(text)
|
||||
self?.viewControllers![self?.selectedIndex ?? 0].children[0].navigationController?.pushViewController(resultVC, animated: false)
|
||||
}
|
||||
self?.present(playerVC, animated: true)
|
||||
}
|
||||
}
|
||||
|
||||
@ -123,7 +123,7 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont
|
||||
//歌词View
|
||||
private lazy var lyricsView:MPPositive_PlayerLyricView = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: 480*width))
|
||||
var recommendBlock:(() -> Void)?
|
||||
|
||||
var searchBlock:((String) -> Void)?
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
//隐藏导航栏label
|
||||
@ -199,6 +199,15 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont
|
||||
alertController.addAction(sure)
|
||||
present(alertController, animated: true)
|
||||
}
|
||||
coverView.searchBlock = {
|
||||
[weak self] (text) in
|
||||
guard let self = self else {return}
|
||||
dismiss(animated: true) {
|
||||
if let block = self.searchBlock {
|
||||
block(text)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
deinit {
|
||||
NotificationCenter.default.removeObserver(self)
|
||||
@ -376,15 +385,15 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont
|
||||
//填充数据
|
||||
backImageView.kf.setImage(with: MP_PlayerManager.shared.loadPlayer.currentVideo?.coverUrl, placeholder: placeholderImage)
|
||||
coverView.coverImageView.kf.setImage(with: MP_PlayerManager.shared.loadPlayer.currentVideo?.coverUrl, placeholder: placeholderImage)
|
||||
coverView.titleLabel.text = MP_PlayerManager.shared.loadPlayer.currentVideo?.title
|
||||
coverView.subtitleLabel.text = MP_PlayerManager.shared.loadPlayer.currentVideo?.subtitle
|
||||
coverView.titleLabel.text = MP_PlayerManager.shared.loadPlayer?.currentVideo?.title
|
||||
coverView.subtitleLabel.text = MP_PlayerManager.shared.loadPlayer?.currentVideo?.subtitle
|
||||
lyricsView.titleLabel.text = MP_PlayerManager.shared.loadPlayer.currentVideo?.title
|
||||
lyricsView.subtitleLabel.text = MP_PlayerManager.shared.loadPlayer.currentVideo?.subtitle
|
||||
lyricsView.lyricsLabel.text = (MP_PlayerManager.shared.loadPlayer.currentVideo?.lyrics ?? "").isEmpty == true ? "No Lyrics":MP_PlayerManager.shared.loadPlayer.currentVideo?.lyrics
|
||||
MPPositive_DownloadItemModel.fetch(predicate: .init(format: "videoId == %@", MP_PlayerManager.shared.loadPlayer.currentVideo?.song.videoId ?? "")) { [weak self] results in
|
||||
lyricsView.subtitleLabel.text = MP_PlayerManager.shared.loadPlayer?.currentVideo?.subtitle
|
||||
lyricsView.lyricsLabel.text = (MP_PlayerManager.shared.loadPlayer?.currentVideo?.lyrics ?? "").isEmpty == true ? "No Lyrics":MP_PlayerManager.shared.loadPlayer?.currentVideo?.lyrics
|
||||
MPPositive_DownloadItemModel.fetch(predicate: .init(format: "videoId == %@", MP_PlayerManager.shared.loadPlayer?.currentVideo?.song.videoId ?? "")) { [weak self] results in
|
||||
self?.coverView.downloadButton.state = results.count != 0 ? .downloaded:.startDownload
|
||||
}
|
||||
coverView.collectionSongBtn.isSelected = MP_PlayerManager.shared.loadPlayer.currentVideo?.isCollection ?? false
|
||||
coverView.collectionSongBtn.isSelected = MP_PlayerManager.shared.loadPlayer?.currentVideo?.isCollection ?? false
|
||||
coverView.setProgress(MP_PlayerManager.shared.loadPlayer?.currentVideo?.song?.videoId ?? "")
|
||||
switchPlayTypeBtnIcon(typeBtn)
|
||||
// activityIndicator.isHidden = true
|
||||
|
||||
@ -198,7 +198,11 @@ class MPPositive_RecommendViewController: MPPositive_BaseViewController,UIViewCo
|
||||
}
|
||||
@objc override func popActionClick(_ sender:UIButton) {
|
||||
super.popActionClick(sender)
|
||||
navigationController?.popToRootViewController(animated: false)
|
||||
MPPositive_Debouncer.shared.call {
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
navigationController?.popToRootViewController(animated: false)
|
||||
}
|
||||
}
|
||||
}
|
||||
//MARK: - collectionView
|
||||
|
||||
@ -98,7 +98,10 @@ class MPPositive_SearchResultShowViewController: MPPositive_BaseViewController,
|
||||
}
|
||||
resultsShowView.scrollBlock = {
|
||||
[weak self] in
|
||||
self?.view?.endEditing(true)
|
||||
guard let self = self else {return}
|
||||
DispatchQueue.main.async {
|
||||
self.view?.endEditing(true)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -183,7 +186,11 @@ class MPPositive_SearchResultShowViewController: MPPositive_BaseViewController,
|
||||
}
|
||||
//取消并返回上一页
|
||||
@objc private func backPopClick(_ sender:UIButton) {
|
||||
navigationController?.popViewController(animated: true)
|
||||
MPPositive_Debouncer.shared.call {
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
navigationController?.popToRootViewController(animated: false)
|
||||
}
|
||||
}
|
||||
}
|
||||
//MARK: - UITextFieldDelegate
|
||||
@ -227,13 +234,17 @@ extension MPPositive_SearchResultShowViewController:UITextFieldDelegate {
|
||||
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
||||
//判断textField是否存在文本
|
||||
if let text = textField.text, text.isEmpty != true {
|
||||
self.searchText = text
|
||||
//用户输入了文本
|
||||
resultsShowView.loadModel = .init(text)
|
||||
MP_AnalyticsManager.shared.search_sug_clickAction(text)
|
||||
suggestionView.isHidden = true
|
||||
//停止输入
|
||||
view.endEditing(true)
|
||||
MPPositive_Debouncer.shared.call {
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
self.searchText = text
|
||||
//用户输入了文本
|
||||
resultsShowView.loadModel = .init(text)
|
||||
MP_AnalyticsManager.shared.search_sug_clickAction(text)
|
||||
suggestionView.isHidden = true
|
||||
//停止输入
|
||||
view.endEditing(true)
|
||||
}
|
||||
return true
|
||||
}else {
|
||||
return false
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
|
||||
import UIKit
|
||||
import DownloadButton
|
||||
import MarqueeLabel
|
||||
//B面播放器封面View(封面,标题,副标题,收藏,下载,进度条View)
|
||||
class MPPositive_PlayerCoverView: UIView, PKDownloadButtonDelegate {
|
||||
///封面
|
||||
@ -16,9 +17,14 @@ class MPPositive_PlayerCoverView: UIView, PKDownloadButtonDelegate {
|
||||
return imageView
|
||||
}()
|
||||
///标题
|
||||
lazy var titleLabel:UILabel = createLabel("Loading", font: .systemFont(ofSize: 22*width, weight: .regular), textColor: .init(hex: "#FFFFFF", alpha: 0.85), textAlignment: .left)
|
||||
lazy var titleLabel:MarqueeLabel = createMarQueeLabel("Loading", font: .systemFont(ofSize: 22*width, weight: .regular), textColor: .init(hex: "#FFFFFF", alpha: 0.85))
|
||||
///副标题
|
||||
lazy var subtitleLabel:UILabel = createLabel("Loading", font: .systemFont(ofSize: 12*width, weight: .regular), textColor: .init(hex: "#EEEEEE", alpha: 0.6), textAlignment: .left)
|
||||
lazy var subtitleLabel:MarqueeLabel = {
|
||||
let label = createMarQueeLabel("Loading", font: .systemFont(ofSize: 12*width, weight: .regular), textColor: .init(hex: "#EEEEEE", alpha: 0.6))
|
||||
label.isUserInteractionEnabled = true
|
||||
label.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(searchSubtitleClick(_ :))))
|
||||
return label
|
||||
}()
|
||||
///收藏按钮
|
||||
lazy var collectionSongBtn:UIButton = {
|
||||
let btn = UIButton()
|
||||
@ -104,6 +110,8 @@ class MPPositive_PlayerCoverView: UIView, PKDownloadButtonDelegate {
|
||||
var deleteBlock:(() -> Void)?
|
||||
//取消
|
||||
var cancelBlock:(() -> Void)?
|
||||
//副标题查询
|
||||
var searchBlock:((String) -> Void)?
|
||||
override init(frame: CGRect) {
|
||||
super.init(frame: frame)
|
||||
backgroundColor = .clear
|
||||
@ -264,6 +272,13 @@ class MPPositive_PlayerCoverView: UIView, PKDownloadButtonDelegate {
|
||||
maskNotReachableView.isHidden = true
|
||||
}
|
||||
}
|
||||
//查询副标题
|
||||
@objc private func searchSubtitleClick(_ sender:UITapGestureRecognizer) {
|
||||
guard let text = subtitleLabel.text, text.isEmpty != true else {return}
|
||||
if let block = searchBlock {
|
||||
block(text)
|
||||
}
|
||||
}
|
||||
|
||||
//调整音乐进度
|
||||
@objc private func seekProgressClick(_ sender: UISlider, forEvent event: UIEvent) {
|
||||
|
||||
@ -39,11 +39,12 @@ class MPPositive_SearchResultsShowView: UIView {
|
||||
MP_HUD.hideNow()
|
||||
isHidden = false
|
||||
MP_AnalyticsManager.shared.search_resultsuccess_actionAction()
|
||||
dataSource.titles = loadModel?.sectionLists.compactMap({$0.title}) ?? []
|
||||
dataSource.reloadData(selectedIndex: 0)
|
||||
segmentView.reloadData()
|
||||
emptyImageView.isHidden = !(dataSource.titles.count == 0)
|
||||
|
||||
if let loadModel = loadModel, let titles = loadModel.sectionLists?.compactMap({$0.title ?? ""}) {
|
||||
dataSource.titles = titles
|
||||
dataSource.reloadData(selectedIndex: 0)
|
||||
segmentView.reloadData()
|
||||
emptyImageView.isHidden = !(titles.count == 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -65,6 +66,7 @@ class MPPositive_SearchResultsShowView: UIView {
|
||||
//数据源
|
||||
private lazy var dataSource:JXSegmentedTitleDataSource = {
|
||||
var dataSource = JXSegmentedTitleDataSource()
|
||||
dataSource.titles = []
|
||||
//标题未选中状态
|
||||
dataSource.titleNormalColor = .init(hex: "#666666")
|
||||
dataSource.titleNormalFont = .systemFont(ofSize: 16*width, weight: .regular)
|
||||
@ -159,8 +161,9 @@ extension MPPositive_SearchResultsShowView: JXSegmentedListContainerViewDataSour
|
||||
let showView:MPPositive_SearchResultPreviewShowView = .init(frame: listContainerView.frame, sectionLists: loadModel.sectionLists)
|
||||
showView.scrollBlock = {
|
||||
[weak self] in
|
||||
if self?.scrollBlock != nil {
|
||||
self?.scrollBlock!()
|
||||
guard let self = self else {return}
|
||||
if let block = scrollBlock {
|
||||
block()
|
||||
}
|
||||
}
|
||||
showView.chooseMoreIndexBlock = {
|
||||
@ -168,7 +171,15 @@ extension MPPositive_SearchResultsShowView: JXSegmentedListContainerViewDataSour
|
||||
guard let self = self else {
|
||||
return
|
||||
}
|
||||
segmentView.selectItemAt(index: selectedIndex)
|
||||
if selectedIndex <= (dataSource.titles.count-1) {
|
||||
//未越界
|
||||
DispatchQueue.main.async {
|
||||
self.segmentView.selectItemAt(index: selectedIndex)
|
||||
}
|
||||
}else {
|
||||
//越界
|
||||
print("当前越界")
|
||||
}
|
||||
}
|
||||
return showView
|
||||
}else {
|
||||
@ -176,8 +187,9 @@ extension MPPositive_SearchResultsShowView: JXSegmentedListContainerViewDataSour
|
||||
let showView:MPPositive_SearchResultTypeShowView = .init(frame: listContainerView.frame, list: loadModel.sectionLists[index])
|
||||
showView.scrollBlock = {
|
||||
[weak self] in
|
||||
if self?.scrollBlock != nil {
|
||||
self?.scrollBlock!()
|
||||
guard let self = self else {return}
|
||||
if let block = scrollBlock {
|
||||
block()
|
||||
}
|
||||
}
|
||||
return showView
|
||||
|
||||
Loading…
Reference in New Issue
Block a user