1.1.1文本滚动版本

This commit is contained in:
Mr.zhou 2024-07-09 11:30:02 +08:00
parent 5f9a43eafd
commit 45455e7c6d
48 changed files with 5360 additions and 2415 deletions

View File

@ -27,5 +27,6 @@ pod 'MJRefresh'
pod "DownloadButton"
#下载框架
pod 'Tiercel'
#文本跑马灯
pod 'MarqueeLabel'
end

View File

@ -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
View File

@ -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
View 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
View 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!
![GIF of MarqueeLabelDemo in action](https://raw.githubusercontent.com/cbpowell/MarqueeLabel/master/Metadata/MarqueeLabelDemo.gif)
## 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!

File diff suppressed because it is too large Load Diff

View 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>

File diff suppressed because it is too large Load Diff

View 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>

View 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>

View File

@ -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>

View 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>

View File

@ -0,0 +1,5 @@
#import <Foundation/Foundation.h>
@interface PodsDummy_MarqueeLabel : NSObject
@end
@implementation PodsDummy_MarqueeLabel
@end

View 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

View 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[];

View 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

View File

@ -0,0 +1,6 @@
framework module MarqueeLabel {
umbrella header "MarqueeLabel-umbrella.h"
export *
module * { export * }
}

View 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

View 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>

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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)

View File

@ -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)

View File

@ -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 = "";

View File

@ -1,5 +1,5 @@
{
"originHash" : "c713d6dac9298f5a58527d975ef56b86c962e56b989f7f618c7fd350cd12ac74",
"originHash" : "d444ada832b2e07cbfed67fc787e76d7499100a1c75497df596832a2bef88ae9",
"pins" : [
{
"identity" : "abseil-cpp-binary",

View File

@ -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")

View File

@ -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>

View File

@ -10,6 +10,7 @@ import AVFoundation
import AppTrackingTransparency
import AdSupport
import MessageUI
import MarqueeLabel
@_exported import JXSegmentedView
@_exported import JXPagingView
//JXPagingListContainerViewextensionJXSegmentedViewListContainer
@ -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() {

View File

@ -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()

View File

@ -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

View File

@ -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] {
//

View File

@ -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 couldnt 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)")

View File

@ -0,0 +1,10 @@
//
// MP_MarQueeLabel.swift
// relax.offline.mp3.music
//
// Created by Mr.Zhou on 2024/7/8.
//
import UIKit
import MarqueeLabel

View File

@ -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 ?? "")")

View File

@ -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):

View File

@ -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)
}
}
}
}
}
}
}

View File

@ -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{

View File

@ -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)
}
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -4,6 +4,7 @@
import UIKit
import DownloadButton
import MarqueeLabel
//BView(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) {

View File

@ -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