Update the refresh animation

dev
wenlei 10 months ago
parent af370934ca
commit 1c880c3e26

@ -40,6 +40,8 @@
7751009A2B62050C00F46109 /* UIImageView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 775100992B62050C00F46109 /* UIImageView+Rx.swift */; }; 7751009A2B62050C00F46109 /* UIImageView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 775100992B62050C00F46109 /* UIImageView+Rx.swift */; };
7751009C2B62065800F46109 /* Date+IndieMusic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7751009B2B62065800F46109 /* Date+IndieMusic.swift */; }; 7751009C2B62065800F46109 /* Date+IndieMusic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7751009B2B62065800F46109 /* Date+IndieMusic.swift */; };
7751009E2B62330900F46109 /* PopoverMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7751009D2B62330900F46109 /* PopoverMenu.swift */; }; 7751009E2B62330900F46109 /* PopoverMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7751009D2B62330900F46109 /* PopoverMenu.swift */; };
775100A02B63442500F46109 /* refresh.json in Resources */ = {isa = PBXBuildFile; fileRef = 7751009F2B63442500F46109 /* refresh.json */; };
775100A42B6344C700F46109 /* img_0.png in Resources */ = {isa = PBXBuildFile; fileRef = 775100A32B6344C700F46109 /* img_0.png */; };
7751D3502B42ABBF00F1F2BD /* SettingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7751D34F2B42ABBF00F1F2BD /* SettingViewController.swift */; }; 7751D3502B42ABBF00F1F2BD /* SettingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7751D34F2B42ABBF00F1F2BD /* SettingViewController.swift */; };
7751D3522B42AC2B00F1F2BD /* SettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7751D3512B42AC2B00F1F2BD /* SettingView.swift */; }; 7751D3522B42AC2B00F1F2BD /* SettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7751D3512B42AC2B00F1F2BD /* SettingView.swift */; };
7751D3542B42AE0E00F1F2BD /* SettingViewMdel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7751D3532B42AE0E00F1F2BD /* SettingViewMdel.swift */; }; 7751D3542B42AE0E00F1F2BD /* SettingViewMdel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7751D3532B42AE0E00F1F2BD /* SettingViewMdel.swift */; };
@ -258,6 +260,8 @@
775100992B62050C00F46109 /* UIImageView+Rx.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImageView+Rx.swift"; sourceTree = "<group>"; }; 775100992B62050C00F46109 /* UIImageView+Rx.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImageView+Rx.swift"; sourceTree = "<group>"; };
7751009B2B62065800F46109 /* Date+IndieMusic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+IndieMusic.swift"; sourceTree = "<group>"; }; 7751009B2B62065800F46109 /* Date+IndieMusic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+IndieMusic.swift"; sourceTree = "<group>"; };
7751009D2B62330900F46109 /* PopoverMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopoverMenu.swift; sourceTree = "<group>"; }; 7751009D2B62330900F46109 /* PopoverMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopoverMenu.swift; sourceTree = "<group>"; };
7751009F2B63442500F46109 /* refresh.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = refresh.json; sourceTree = "<group>"; };
775100A32B6344C700F46109 /* img_0.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = img_0.png; sourceTree = "<group>"; };
7751D34F2B42ABBF00F1F2BD /* SettingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingViewController.swift; sourceTree = "<group>"; }; 7751D34F2B42ABBF00F1F2BD /* SettingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingViewController.swift; sourceTree = "<group>"; };
7751D3512B42AC2B00F1F2BD /* SettingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingView.swift; sourceTree = "<group>"; }; 7751D3512B42AC2B00F1F2BD /* SettingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingView.swift; sourceTree = "<group>"; };
7751D3532B42AE0E00F1F2BD /* SettingViewMdel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingViewMdel.swift; sourceTree = "<group>"; }; 7751D3532B42AE0E00F1F2BD /* SettingViewMdel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingViewMdel.swift; sourceTree = "<group>"; };
@ -518,6 +522,23 @@
path = JournalDetail; path = JournalDetail;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
775100A12B63442900F46109 /* Json */ = {
isa = PBXGroup;
children = (
775100A22B6344C700F46109 /* images */,
7751009F2B63442500F46109 /* refresh.json */,
);
path = Json;
sourceTree = "<group>";
};
775100A22B6344C700F46109 /* images */ = {
isa = PBXGroup;
children = (
775100A32B6344C700F46109 /* img_0.png */,
);
path = images;
sourceTree = "<group>";
};
775D07562B5E47C4009270D3 /* ETPopupView */ = { 775D07562B5E47C4009270D3 /* ETPopupView */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -586,6 +607,7 @@
778B8A512AF8EA2A0034AFD4 /* Resources */ = { 778B8A512AF8EA2A0034AFD4 /* Resources */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
775100A12B63442900F46109 /* Json */,
778B8A292AF8E36E0034AFD4 /* Assets.xcassets */, 778B8A292AF8E36E0034AFD4 /* Assets.xcassets */,
778B8A2E2AF8E36E0034AFD4 /* Info.plist */, 778B8A2E2AF8E36E0034AFD4 /* Info.plist */,
); );
@ -1052,9 +1074,11 @@
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
775100A42B6344C700F46109 /* img_0.png in Resources */,
778B8A2D2AF8E36E0034AFD4 /* LaunchScreen.storyboard in Resources */, 778B8A2D2AF8E36E0034AFD4 /* LaunchScreen.storyboard in Resources */,
778B8A2A2AF8E36E0034AFD4 /* Assets.xcassets in Resources */, 778B8A2A2AF8E36E0034AFD4 /* Assets.xcassets in Resources */,
778B8A282AF8E36D0034AFD4 /* Main.storyboard in Resources */, 778B8A282AF8E36D0034AFD4 /* Main.storyboard in Resources */,
775100A02B63442500F46109 /* refresh.json in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };

@ -36,6 +36,7 @@ class NavigationController: UINavigationController {
super.viewDidLoad() super.viewDidLoad()
setup() setup()
view.backgroundColor = .white
let appearance = UINavigationBarAppearance() let appearance = UINavigationBarAppearance()
appearance.backgroundColor = .white appearance.backgroundColor = .white

@ -29,8 +29,8 @@ class RefreshLoadingView: UIView {
animationView.backgroundColor = .clear animationView.backgroundColor = .clear
animationView.frame = CGRect(x: 0.0, y: 0.0, width: animationSize, height: animationSize) animationView.frame = CGRect(x: 0.0, y: 0.0, width: animationSize, height: animationSize)
animationView.loopMode = .loop animationView.loopMode = .loop
animationView.animation = LottieAnimation.named("loading_header") animationView.animation = LottieAnimation.named("refresh")
animationView.backgroundColor = .red
return animationView return animationView
} }

@ -18,7 +18,7 @@ struct JournalDetail: Codable {
let tags: [String]? let tags: [String]?
let date: Int? let date: Int?
let content: String? let content: String?
// let isExpand: Bool? var isExpand: Bool?
} }
struct Journal: Codable { struct Journal: Codable {

@ -11,6 +11,7 @@ import RxCocoa
import RxDataSources import RxDataSources
import ETNavBarTransparent import ETNavBarTransparent
import SVProgressHUD import SVProgressHUD
import RxOptional
class JournalDetailController: ViewController, UIScrollViewDelegate { class JournalDetailController: ViewController, UIScrollViewDelegate {
@ -70,6 +71,9 @@ class JournalDetailController: ViewController, UIScrollViewDelegate {
return collectionView return collectionView
}() }()
weak var audioHeaderView: JournalAudioHeaderView?
var commentToolView: CommentToolView = { var commentToolView: CommentToolView = {
let commentToolView = CommentToolView.init() let commentToolView = CommentToolView.init()
@ -151,13 +155,18 @@ class JournalDetailController: ViewController, UIScrollViewDelegate {
} }
}, },
configureSupplementaryView: { dataSource, collectionView, kind, indexPath in configureSupplementaryView: { [weak self] dataSource, collectionView, kind, indexPath in
guard kind == UICollectionView.elementKindSectionHeader else { guard kind == UICollectionView.elementKindSectionHeader, let self = self else {
return UICollectionReusableView() return UICollectionReusableView()
} }
if indexPath.section == 0 { if indexPath.section == 0 {
let resuableView: JournalAudioHeaderView = collectionView.dequeueReusableSupplementaryView(ofKind: "UICollectionElementKindSectionHeader", withReuseIdentifier: "JournalAudioHeaderView", for: indexPath) as! JournalAudioHeaderView let resuableView: JournalAudioHeaderView = collectionView.dequeueReusableSupplementaryView(ofKind: "UICollectionElementKindSectionHeader", withReuseIdentifier: "JournalAudioHeaderView", for: indexPath) as! JournalAudioHeaderView
self.audioHeaderView = resuableView
let section = dataSource.sectionModels.first.value let section = dataSource.sectionModels.first.value
resuableView.journalDetail = section?.header
resuableView.saveButton.rx.tap.subscribe { _ in resuableView.saveButton.rx.tap.subscribe { _ in
resuableView.titleImageView.image?.saveImageToPhotoLibrary() resuableView.titleImageView.image?.saveImageToPhotoLibrary()
@ -171,15 +180,17 @@ class JournalDetailController: ViewController, UIScrollViewDelegate {
}.disposed(by: self.rx.disposeBag) }.disposed(by: self.rx.disposeBag)
resuableView.journalDetail = section?.header
resuableView.dropButtonTapObservable.subscribe { _ in resuableView.dropButtonTapObservable.subscribe { _ in
viewModel.isExpand.accept(!viewModel.isExpand.value) viewModel.isExpand.accept(!resuableView.isExpand)
resuableView.isExpand = viewModel.isExpand.value viewModel.updateHeaderHeight(newHeight: viewModel.isExpand.value ? 506 + BaseDimensions.topHeight : 400 + BaseDimensions.topHeight)
// resuableView.isExpand = viewModel.isExpand.value
}.disposed(by: self.rx.disposeBag) }.disposed(by: self.rx.disposeBag)
resuableView.playButtonTapObservable.subscribe { _ in
resuableView.playButtonTapObservable.subscribe { _ in
AudioManager.sharedInstance.playlist
}.disposed(by: self.rx.disposeBag) }.disposed(by: self.rx.disposeBag)
resuableView.downLoadButtonTapObservable.subscribe { _ in resuableView.downLoadButtonTapObservable.subscribe { _ in
@ -206,39 +217,52 @@ class JournalDetailController: ViewController, UIScrollViewDelegate {
output.items.bind(to: collectionView.rx.items(dataSource: dataSource)).disposed(by: rx.disposeBag) output.items.bind(to: collectionView.rx.items(dataSource: dataSource)).disposed(by: rx.disposeBag)
input.selection.drive { indexPath in
output.itemSelected.subscribe { [weak self] sectionItem in
// guard let items = output.items.value.first?.items,
// let track = sectionItem.element else { return }
//
//
//
// let playerViewModel = PlayerViewModel.init(track: track, provider: viewModel.provider)
// self?.navigator.show(segue: .player(viewModel: playerViewModel), sender: self, transition: .modal)
//
// AudioManager.sharedInstance.setPlaylist(list: items)
// AudioManager.sharedInstance.playTrack(track: track)
}.disposed(by: rx.disposeBag) }.disposed(by: rx.disposeBag)
// _ = self.headerView.dropButton.rx.isSelected <-> viewModel.isExpand output.itemSelected.subscribe { [weak self] sectionItem in
switch sectionItem {
case .audioItem(let track):
let audioModels: [AudioTrack] = output.items.value.flatMap { section -> [JournalItem] in
switch section {
case .audio(_, let items):
return items
default:
return []
}
}.compactMap { item -> AudioTrack? in
if case let .audioItem(model) = item {
return model
} else {
return nil
}
}
let playerViewModel = PlayerViewModel.init(track: track, provider: viewModel.provider)
self?.navigator.show(segue: .player(viewModel: playerViewModel), sender: self, transition: .modal)
// viewModel.isExpand
// .bind(to: self.headerView.dropButton.rx.isSelected)
// .disposed(by: rx.disposeBag)
output.isExpand.subscribe { [weak self] isExpand in AudioManager.sharedInstance.setPlaylist(list: audioModels)
AudioManager.sharedInstance.playTrack(track: track)
// print("dropButtonTrigger \(isExpand)")
// self?.headerView.isExpand = isExpand
viewModel.updateHeaderHeight(newHeight: isExpand ? 506 + BaseDimensions.topHeight : 400 + BaseDimensions.topHeight)
self?.collectionView.collectionViewLayout.invalidateLayout()
} .disposed(by: rx.disposeBag)
case .journaItem(let _):
break
}
}.disposed(by: rx.disposeBag)
} }

@ -156,7 +156,7 @@ class JournalAudioHeaderView: UICollectionReusableView {
var isExpand = false { var isExpand = false {
didSet { didSet {
print("JournalAudioHeaderView isExpand: \(isExpand) ")
switch isExpand { switch isExpand {
case true: case true:
dropButton.isSelected = true dropButton.isSelected = true
@ -211,6 +211,7 @@ class JournalAudioHeaderView: UICollectionReusableView {
contentLabel.text = journalDetail.content contentLabel.text = journalDetail.content
self.isExpand = journalDetail.isExpand ?? false
} }
} }

@ -25,7 +25,7 @@ class JournalDetailViewModel: ViewModel, ViewModelType {
struct Output { struct Output {
let items: BehaviorRelay<[JournalSection]> let items: BehaviorRelay<[JournalSection]>
let selection: Driver<IndexPath> let selection: Driver<IndexPath>
let itemSelected: PublishSubject<AudioTrack> let itemSelected: PublishSubject<JournalItem>
let journalDetail: PublishSubject<JournalDetail> let journalDetail: PublishSubject<JournalDetail>
@ -35,7 +35,7 @@ class JournalDetailViewModel: ViewModel, ViewModelType {
let isExpand: BehaviorRelay<Bool> let isExpand: BehaviorRelay<Bool>
} }
let itemSelected = PublishSubject<AudioTrack>() let itemSelected = PublishSubject<JournalItem>()
// let items = BehaviorRelay<[JournalSection]>.init(value: []) // let items = BehaviorRelay<[JournalSection]>.init(value: [])
let isExpand = BehaviorRelay<Bool>.init(value: false) let isExpand = BehaviorRelay<Bool>.init(value: false)
@ -58,28 +58,6 @@ class JournalDetailViewModel: ViewModel, ViewModelType {
}.disposed(by: rx.disposeBag) }.disposed(by: rx.disposeBag)
// input.dropButtonTrigger.drive { _ in
//
// self.isExpand.accept(!self.isExpand.value)
//
// }.disposed(by: rx.disposeBag)
//
// let journalDetail = JournalDetail.init(audio: "", cover: "", title: "", artist: "", number: "", tags: [], date: 0, content: "", isExpand: false)
// let item = AudioTrack.init(artists: [], availableMarkets: [""], discNumber: 0, durationMs: 0, explicit: false, externalUrls: ["": ""], id: "", name: "123", previewUrl: "")
//
// let journalSection = JournalSection.init(items: [item, item, item, item], journalDetail: journalDetail)
//
// items.accept([journalSection])
input.selection.drive { indexPath in
// guard let sectionItem = elements.value.first?.items[indexPath.row] else { return }
// self.itemSelected.onNext(sectionItem)
}.disposed(by: rx.disposeBag)
let journal = PublishSubject<JournalDetail>.init() let journal = PublishSubject<JournalDetail>.init()
@ -87,12 +65,10 @@ class JournalDetailViewModel: ViewModel, ViewModelType {
let dowloadState: Driver<Float> = .just(0) let dowloadState: Driver<Float> = .just(0)
let isLike = BehaviorRelay<Bool>.init(value: false) let isLike = BehaviorRelay<Bool>.init(value: false)
let isLick = BehaviorRelay<Bool>.init(value: false)
self.requestMusic(journalNo: journalNo).subscribe { audioTrackArray in self.requestMusic(journalNo: journalNo).subscribe { audioTrackArray in
let journalDetail = JournalDetail.init(audio: "", cover: "https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RE4wB6X?ver=c628", title: "132", artist: "132132132132132", number: "321", tags: [], date: 1706062128, content: "总在不经意间获得简单朴素且乐趣其中的感怀,这种感怀的妙处在于它没有试图去提炼出任何的真理,他就像我们恬然的谈话里总夹杂着“那我懂你的意思了”,但是否是真的明白,却不然得知。即总在不经意间获得简单朴素且乐趣其中的感怀,这种感怀的妙处在于它没有试图去提炼出任何的真理,他就像我们恬然的谈话里总夹杂着“那我懂你的意思了”,但是否是真的明白,却不然得知。即总在不经意间获得简单朴素且乐趣其中的感怀,这种感怀的妙处在于它没有试图去提炼出任何的真理,他就像我们恬然的谈话里总夹杂着“那我懂你的意思了”,但是否是真的明白,却不然得知。即总在不经意间获得简单朴素且乐趣其中的感怀,这种感怀的妙处在于它没有试图去提炼出任何的真理,他就像我们恬然的谈话里总夹杂着“那我懂你的意思了”,但是否是真的明白,却不然得知。即") let journalDetail = JournalDetail.init(audio: "", cover: "https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RE4wB6X?ver=c628", title: "132", artist: "132132132132132", number: "321", tags: [], date: 1706062128, content: "总在不经意间获得简单朴素且乐趣其中的感怀,这种感怀的妙处在于它没有试图去提炼出任何的真理,他就像我们恬然的谈话里总夹杂着“那我懂你的意思了”,但是否是真的明白,却不然得知。即总在不经意间获得简单朴素且乐趣其中的感怀,这种感怀的妙处在于它没有试图去提炼出任何的真理,他就像我们恬然的谈话里总夹杂着“那我懂你的意思了”,但是否是真的明白,却不然得知。即总在不经意间获得简单朴素且乐趣其中的感怀,这种感怀的妙处在于它没有试图去提炼出任何的真理,他就像我们恬然的谈话里总夹杂着“那我懂你的意思了”,但是否是真的明白,却不然得知。即总在不经意间获得简单朴素且乐趣其中的感怀,这种感怀的妙处在于它没有试图去提炼出任何的真理,他就像我们恬然的谈话里总夹杂着“那我懂你的意思了”,但是否是真的明白,却不然得知。即", isExpand: false)
let audioArray = audioTrackArray.map { audioTrack in let audioArray = audioTrackArray.map { audioTrack in
@ -114,6 +90,31 @@ class JournalDetailViewModel: ViewModel, ViewModelType {
}.disposed(by: rx.disposeBag) }.disposed(by: rx.disposeBag)
input.selection.drive { indexPath in
let sectionItem = elements.value[indexPath.section].items[indexPath.row]
self.itemSelected.onNext(sectionItem)
}.disposed(by: rx.disposeBag)
isExpand.subscribe { isExpand in
var new = elements.value
if var header = new.first?.header {
header.isExpand = isExpand
if let items = new.first?.items {
new[0] = .audio(header: header, items: items)
elements.accept(new)
}
}
}.disposed(by: rx.disposeBag)
// input.dropButtonTrigger.drive { _ in // input.dropButtonTrigger.drive { _ in
// self.isExpand.accept(!self.isExpand.value) // self.isExpand.accept(!self.isExpand.value)
// }.disposed(by: rx.disposeBag) // }.disposed(by: rx.disposeBag)
@ -142,6 +143,7 @@ class JournalDetailViewModel: ViewModel, ViewModelType {
func requestMusic(journalNo: String) -> Observable<[AudioTrack]> { func requestMusic(journalNo: String) -> Observable<[AudioTrack]> {
return self.provider.journalMusic(journalNo: journalNo) return self.provider.journalMusic(journalNo: journalNo)

@ -90,11 +90,6 @@ class MessageViewController: ViewController, UIScrollViewDelegate {
view.addSubview(messageTopView) view.addSubview(messageTopView)
view.addSubview(tableView) view.addSubview(tableView)
view.addSubview(noDataView) view.addSubview(noDataView)
} }
override func bindViewModel() { override func bindViewModel() {
@ -131,13 +126,10 @@ class MessageViewController: ViewController, UIScrollViewDelegate {
return cell return cell
case .activitiesItem(let message): case .activitiesItem(let message):
let cell: MessageActivitiesViewCell = tableView.dequeueReusableCell(withIdentifier: "MessageActivitiesViewCell", for: indexPath) as! MessageActivitiesViewCell let cell: MessageActivitiesViewCell = tableView.dequeueReusableCell(withIdentifier: "MessageActivitiesViewCell", for: indexPath) as! MessageActivitiesViewCell
return cell return cell
} }
} }
) )

@ -35,7 +35,7 @@ class AudioTrackListViewModel: ViewModel, ViewModelType {
func transform(input: Input) -> Output { func transform(input: Input) -> Output {
let journalDetail = JournalDetail.init(audio: "", cover: "", title: "", artist: "", number: "", tags: [], date: 0, content: "") let journalDetail = JournalDetail.init(audio: "", cover: "", title: "", artist: "", number: "", tags: [], date: 0, content: "", isExpand: false)
// let item = AudioTrack.init(artists: [], availableMarkets: [""], discNumber: 0, durationMs: 0, explicit: false, externalUrls: ["": ""], id: "", name: "123", previewUrl: "") // let item = AudioTrack.init(artists: [], availableMarkets: [""], discNumber: 0, durationMs: 0, explicit: false, externalUrls: ["": ""], id: "", name: "123", previewUrl: "")
// //
// let item1 = AudioTrack.init(artists: [], availableMarkets: [""], discNumber: 0, durationMs: 0, explicit: false, externalUrls: ["": ""], id: "", name: "123", previewUrl: "", isPlaying: true) // let item1 = AudioTrack.init(artists: [], availableMarkets: [""], discNumber: 0, durationMs: 0, explicit: false, externalUrls: ["": ""], id: "", name: "123", previewUrl: "", isPlaying: true)

@ -1,8 +1,115 @@
{ {
"images" : [ "images" : [
{ {
"filename" : "icon-20@2x.png",
"idiom" : "universal", "idiom" : "universal",
"platform" : "ios", "platform" : "ios",
"scale" : "2x",
"size" : "20x20"
},
{
"filename" : "icon-20@3x.png",
"idiom" : "universal",
"platform" : "ios",
"scale" : "3x",
"size" : "20x20"
},
{
"filename" : "icon-29@2x.png",
"idiom" : "universal",
"platform" : "ios",
"scale" : "2x",
"size" : "29x29"
},
{
"filename" : "icon-29@3x.png",
"idiom" : "universal",
"platform" : "ios",
"scale" : "3x",
"size" : "29x29"
},
{
"filename" : "icon-38@2x.png",
"idiom" : "universal",
"platform" : "ios",
"scale" : "2x",
"size" : "38x38"
},
{
"filename" : "icon-38@3x.png",
"idiom" : "universal",
"platform" : "ios",
"scale" : "3x",
"size" : "38x38"
},
{
"filename" : "icon-40@2x.png",
"idiom" : "universal",
"platform" : "ios",
"scale" : "2x",
"size" : "40x40"
},
{
"filename" : "icon-40@3x.png",
"idiom" : "universal",
"platform" : "ios",
"scale" : "3x",
"size" : "40x40"
},
{
"filename" : "icon-60@2x.png",
"idiom" : "universal",
"platform" : "ios",
"scale" : "2x",
"size" : "60x60"
},
{
"filename" : "icon-60@3x.png",
"idiom" : "universal",
"platform" : "ios",
"scale" : "3x",
"size" : "60x60"
},
{
"filename" : "icon-64@2x.png",
"idiom" : "universal",
"platform" : "ios",
"scale" : "2x",
"size" : "64x64"
},
{
"filename" : "icon-64@3x.png",
"idiom" : "universal",
"platform" : "ios",
"scale" : "3x",
"size" : "64x64"
},
{
"filename" : "icon-68@2x.png",
"idiom" : "universal",
"platform" : "ios",
"scale" : "2x",
"size" : "68x68"
},
{
"filename" : "icon-76@2x.png",
"idiom" : "universal",
"platform" : "ios",
"scale" : "2x",
"size" : "76x76"
},
{
"filename" : "icon-83.5@2x.png",
"idiom" : "universal",
"platform" : "ios",
"scale" : "2x",
"size" : "83.5x83.5"
},
{
"filename" : "icon-1024.png",
"idiom" : "universal",
"platform" : "ios",
"scale" : "1x",
"size" : "1024x1024" "size" : "1024x1024"
} }
], ],

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 844 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 818 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

@ -0,0 +1 @@
{"v":"5.10.0","fr":25,"ip":0,"op":60,"w":600,"h":600,"nm":"刷新2","ddd":0,"assets":[{"id":"image_0","w":403,"h":397,"u":"images/","p":"img_0.png","e":0}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"图层 1/落网-刷新2.ai","cl":"ai","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[285.563,226,0],"ix":2,"l":2},"a":{"a":0,"k":[201.5,198.5,0],"ix":1,"l":2},"s":{"a":0,"k":[84,84,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":65,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"线条1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[340.25,338.491,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-30.747,0.367],[-35.209,-1.729],[-36.845,2.053],[-23.184,-4.838],[-33.248,21.411]],"o":[[11.571,-8.138],[28.998,-0.346],[37.024,1.818],[35.701,-1.989],[35.387,7.384],[31.551,-22.749]],"v":[[-258.613,128.679],[-185.009,105.429],[-97.813,121.395],[4.221,101.331],[82.51,115.879],[181.994,103.447]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.228],"y":[1.164]},"t":0,"s":[0]},{"t":46,"s":[100]}],"ix":1},"e":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"修剪路径 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":65,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"线条2","sr":1,"ks":{"o":{"a":0,"k":60,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[340.25,385.491,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-30.747,0.367],[-35.209,-1.729],[-36.845,2.053],[-23.184,-4.838],[-33.248,21.411]],"o":[[11.571,-8.138],[28.998,-0.346],[37.024,1.818],[35.701,-1.989],[35.387,7.384],[31.551,-22.749]],"v":[[-258.613,128.679],[-185.009,105.429],[-97.813,121.395],[4.221,101.331],[82.51,115.879],[181.994,103.447]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.228],"y":[1.164]},"t":0,"s":[0]},{"t":46,"s":[100]}],"ix":1},"e":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"修剪路径 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":65,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"线条3","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[340.25,432.491,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-30.747,0.367],[-35.209,-1.729],[-36.845,2.053],[-23.184,-4.838],[-33.248,21.411]],"o":[[11.571,-8.138],[28.998,-0.346],[37.024,1.818],[35.701,-1.989],[35.387,7.384],[31.551,-22.749]],"v":[[-258.613,128.679],[-185.009,105.429],[-97.813,121.395],[4.221,101.331],[82.51,115.879],[181.994,103.447]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.228],"y":[1.164]},"t":0,"s":[0]},{"t":46,"s":[100]}],"ix":1},"e":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"修剪路径 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":65,"st":0,"ct":1,"bm":0}],"markers":[]}
Loading…
Cancel
Save