小编Sta*_*nov的帖子

UICollectionViewCell中的AVPlayerLayer,或者如何将GIF加载为WhatsApp

在应用程序中,我有一个UICollectionView项目大小,以便在屏幕上同时可以看到约20项.我想在每个单元格中显示的内容是从Giphy/Tenor下载的Gif图像.

但是,我意识到gif文件比Tenor和Giphy为每个动画图像提供的相对mp4文件占用更多空间(和加载时间),这实际上是显而易见的,因为mp4文件格式具有压缩逻辑和类似的东西.抱歉,如果我使用错误的条款.

为了让列表加载更快,我决定使用UIImageViewGIF图像切换AVPlayerLayer,导致mp4文件比GIF图像轻10倍.但是我遇到了类似于HERE所描述的性能问题.流量大致相同,我同时可以看到20多个项目,但由于硬件限制,它只显示16个视频.我找不到任何解决方法或任何其他允许同时AVPlayerLayer显示超过16个视频的框架.

我想知道WhatsApp应用程序如何工作并处理这个逻辑.它还有Tenor的GIF选择.我已经检查并发现WhatsApp下载的是小视频文件,而不是gif图像.这就是它加载速度非常快的原因.但我不知道他们如何同时展示20多件商品.这是在WhatsApp中的工作原理 - https://media.giphy.com/media/33E84h3RAVn0vQWZak/giphy.gif.此外,我在滚动期间注意到小静态预览正在显示,但我没有看到应用程序请求它.可能他们在飞行中获得了gif的第一帧,而主线程没有任何延迟.

我也尝试过,但是即使我在后台线程中创建了所有内容,并且主线程上的唯一一行是"self.imageView.image = myImage",如果我在行中有8个项目,那么无论如何它还是拖了一下例如,滚动非常快.

我看到只有两种可能的解决方案让它加载速度快(因此我们肯定需要加载mp4而不是gif),并且滚动平滑且没有凸耳:
1.WhatsApp使用自己的自定义视频核心在UICollectionViewCell中显示视频.
2. WhatsApp下载视频以加快下载过程,但随后将mp4文件编码为gif,并使用常规动画UIImageView显示输出gif文件.然而,在"大规模"滚动期间,如果没有拖拽,我无法让这个流程工作得非常快

有关如何实现相同的想法,使其像WhatsApp一样快速顺畅地工作?我无法检查它如何处理下载的信息,但肯定它下载mp4文件而不是gif文件.

xcode avfoundation ios avplayer swift

9
推荐指数
0
解决办法
474
查看次数

更新到Xcode 9和Swift 4

我是Swift的新手(不到一整年),我不知道如何在每年的新Xcode中更新到最新的Swift.我的项目已开始下Xcode 8Swift 3.2.现在我升级了Xcode 9,AFAIU支持Swift 4.

自从我使用以来Cocoapods,我显然将所有pod更新为最新版本,我认为这是正确的行为.

但是,我看到Swift version目标设置仍然设置为Swift 3.2.这到底是什么意思呢?我应该Swift 4改为吗?或者就像我必须根据最小版本编写代码一样?

另外,我在项目中有2个警告:

在此输入图像描述

关于Pods,很明显Cocoapods会解决这个问题,所以np.

我的工作区怎么样?我的目标构建良好,没有错误和警告,我不知道为什么它告诉我转换?它不应该用代码告诉文件中的确切行吗?

请描述一般的最新Swift更新的正确流程,以及它如何与每年未更新到最新Swift的一些pod一起使用.我是否会被迫删除它们,或者像fork一样手动更新到最新的Swift?

xcode ios swift swift4 xcode9

7
推荐指数
1
解决办法
4080
查看次数

Xcode Localizable.string多个目标问题

我有一个包含多个目标的项目,它们代表相同的应用程序,只是具有不同的样式和翻译.

由于几乎整个项目对于每个目标看起来都是一样的,我需要在Localizable.strings文件中只有几个字符串,我需要不同.而且我不想将整个巨大的Localizable.strings文件复制到每个项目,因为它几乎没有不同的行.

由于项目中包含第三方库/ SDK,因此我只需要1个字符串文件.所以我不能使用tableNamelocalizedString.

问题是-我需要有一个灵活的可能性,以覆盖从只有几行Localizable.strings对单独每一个目标.而且我不喜欢将整个文件复制到每个目标的想法,因为它将导致将来烦人的流量,如果我将有10个目标并且我需要为所有目标添加1个字符串.

目标是有1个巨大Localizable.strings与包括所有字符串,这将是通用于所有的目标文件,并为每个目标的字符串应该告诉不同的小配置.所以目标的文件应该合并并覆盖常见的文件.

AFAIK它本身不受Xcode的支持,所以我可能正在寻找一个可以使它工作的脚本.

因此,脚本应该查看common和target的Localizable文件,合并它们,如果在两者中都定义了一些键,那么它应该使用target的文件中的一个.

任何人都可以帮我这样的脚本吗?


PS存在类似的问题.xcassets,并且CocoaPods通过将多个资产合并为1来解决它,并且它按预期工作 - 如果某些目标的资产包含已包含在公共资产中的同名图像,那么目标中的一个将取代它.

PS2.Android开发人员本身也支持类似的功能 - 每个图像,每个翻译都可以被"孩子"的瑕疵或者其他任何名称所覆盖:)

xcode localization localizable.strings ios

6
推荐指数
1
解决办法
1210
查看次数

Swift Combine (UIKit) 中的双向绑定

我有一个UITableViewCell包含UISwitch. 这个单元格有它自己的SwitchCellViewModel. 假设它包含一些Bool值(启用与禁用)。并且ViewController是包含UITableViewviewModel为单元格创建并用它设置单元格的人。

我想实现:

  1. 在单元级别:每当 viewModel 的 bool 属性值更改时更改 UISwitch 状态(当然无需重新加载 tableView)。
  2. 在 ViewController 级别:处理 UISwitch 状态更改(由用户)。

用例是下一个:单元格显示一些可以禁用或启用的选项。该操作进入后端,在我收到带有结果的响应(在后端启用与禁用)后,我必须再次将视图状态与更新的数据同步。

我了解如何在单元格级别订阅属性值更改,因此当我从 viewController 在 vi​​ewModel 中更改它时,它会立即更新单元格视图。但我不确定如何处理从UISwitchviewController返回的动作。

是否可以通过@PublishedviewModel 中的单个bool 属性实现,或者对于这种双向情况,我必须有 2 个单独的东西。

我必须Publisher为此目的公开一个单独的@Published属性,这对我来说看起来很愚蠢,因为我已经在 viewmodel 中有一个属性,应该通知该视图控制器,所以我为什么不使用它。但是如果我只使用一个,那么情况就是 ViewController@Published在 viewModel 中设置var,cell 本身会处理它并调整 UI,但 ViewController 也会立即获取有关它的事件,因为它已订阅它。

mvvm uikit ios swift combine

6
推荐指数
1
解决办法
984
查看次数

Reactive Cocoa 5和ReactiveSwift网络请求处理

我正在尝试使用ReactiveSwift和RAC5来确定是否可以根据我的需要实现网络请求处理.

在主题从RACSignal迁移到ReactiveSwift或RAC5我被告知可以使用SignalProducer完成,但深入研究它并没有给我预期的结果

所以,我希望:
1.每次文本更改textField发送请求(按关键字搜索).
2.一旦用户关闭当前的ViewController,当前请求应自动取消
3.能够在关键字更改后取消请求

这就是我所拥有的

self.textField.reactive.continuousTextValues.skipNil().filter({ (value) -> Bool in
        return value.characters.count > 0
    }).observeValues { [unowned self] (value) in
        self.fetchSignalDisposable?.dispose()
        self.fetchSignal = self.producerFor(keyword: value).on(started: {
            print("started")
        }, failed: { (error) in
            print("error")
        }, completed: {
            print("completed")
        }, value: { [unowned self] (items) in
            print("value")
            self.items.append(contentsOf: items)
            self.tableView.reloadData()
        })
        self.fetchSignalDisposable = self.fetchSignal!.start()
    }
Run Code Online (Sandbox Code Playgroud)

这是生产者初始化器

return SignalProducer<Any, NSError> { (observer, disposable) in
        let task: URLSessionDataTask? = NetworkClient.fetchRequestWith(uri: "test", parameters: ["keyword" : keyword], success: { response in
            observer.send(value: …
Run Code Online (Sandbox Code Playgroud)

ios reactive-cocoa racsignal swift reactive-swift

5
推荐指数
1
解决办法
1426
查看次数

UITableView标头在运行时的动态高度

我知道有很多关于它的帖子,但也许在最新的iOS上有一些更新...

我认为我们所有人都有一项创建任务,viewController其中包含大量内容,其中大部分内容都是自我调整的,而最底层则表明你需要展示一些tableView包含很多内容的内容......

可以做的第一个解决方案是使用UIScrollView,而根本不关心reusableCells.
所述第二是使用UITableViewheaderView并手动调整其高度(或通过调用systemLayoutSizeFittingSize:在需要时)各一次.
也许第三解决方案是使用UITableView和自我尺寸UIView分别与具有UIEdgeInsetstableView.并根据什么物体上具有较高的"zIndex的",它可以带来与处理的交互问题......
规定解决方案是使用电池上面全部内容,就像一个独立的单元.根本不确定这是个好主意......

问题:这个问题有新的解决方案吗?我没有深入研究它2年......也许在新的iOS中有类似reusableViews的东西UIScrollView...当然,目标是拥有可重复使用的单元格,并使用自动布局标题而无需手动更新其高度...

uitableview uiscrollview ios

5
推荐指数
5
解决办法
7418
查看次数

UIVideoEditorController委托方法被调用两次

我正在使用UIVideoEditorController,但是成功委托方法为我调用了两次。但是,所有传递的对象的所有指针都告诉它发送完全相同的数据。

let editor = UIVideoEditorController()
editor.videoMaximumDuration = 10.0
editor.videoQuality = .typeIFrame1280x720
editor.delegate = self
editor.videoPath = // some path goes here
self.present(editor, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

然后,以下方法将“ here”打印两次。

func videoEditorController(_ editor: UIVideoEditorController, didSaveEditedVideoToPath editedVideoPath: String) {
    print("here")
    self.dismiss(animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)

ios uivideoeditorcontroller swift

5
推荐指数
2
解决办法
479
查看次数

iOS自定义过渡动画

我已经开始使用UIViewControllerAnimatedTransitioning协议学习自定义过渡动画.我们在youtube上找到的所有视频都是基于流程的,当我们有新的ViewController呈现圆形动画或类似的时候.

我在实现转换方式时遇到问题.大多数情况下,我需要的是类似于facebook应用程序以及它们如何打开全屏图像查看器.

所以,让我们说我们有 VC1VC2.在VC1我们所说的行动提出VC2.在两者上VC我们都有相同的UI元素.就我而言UIImageView.就像你点击imageViewVC1和它打开详细信息页面,其顶部图像的一些对象.我希望有动画,看起来像是将图像从VC1框架更改为图像的最终帧VC2,然后应该出现详细页面上的其他内容(如标签,按钮等).

但是我在训练中遇到了一些问题.
1.首先,我不明白的想法containerViewtransitionContext.但正如我所看到的,它就像转换之间的中间状态.那是对的吗?但这对我来说很奇怪,因为即使是backgroundColor不起作用的财产containerView.
2.我不明白在转换过程中我需要做什么动画,以及containerViewsubViews 的结构应该是什么.在我的例子中,在演示时VC2,我需要,据我所知,有点隐藏其所有子视图.然后将imageView 从from VC1框架设置为动画,然后再次显示所有子视图.那么,在这种情况下应该添加到containerView?如果是这样,那么它应该是实际的,或者是imageView的全新副本,具有相同的帧/图像,只是在转换过程中暂时使用... imageViewVC2imageViewimageViewVC1

将我链接到带有类似动画的examples/tutorial/code会很有帮助

这是链接到如何在Facebook中工作

uiviewanimation uiviewanimationtransition ios swift

4
推荐指数
1
解决办法
7227
查看次数

从RACSignal迁移到ReactiveSwift或RAC5

我是Swift的新手,这也是我使用Reactive Cocoa v5或Reactive Swift的原因.

以前我在RAC 2.x上使用RACSignal,我喜欢这样做:

- (RACSignal *)signalForGET:(NSString *)URLString parameters:(NSDictionary *)parameters {
  return [RACSignal createSignal:^RACDisposable *(id <RACSubscriber> subscriber) {
      AFHTTPRequestOperation *op = [self GET:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
          [subscriber sendNext:responseObject];
          [subscriber sendCompleted];
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
          [subscriber sendError:error];
      }];
      return [RACDisposable disposableWithBlock:^{
          [op cancel];
      }];
   }];
}
Run Code Online (Sandbox Code Playgroud)

在这里我喜欢它取消一次性请求,我也可以通过调用dispose返回信号的方法手动取消它.

我对Reactive Swift中的所有这些东西感到有点困惑,比如SignalProducers等.

请举例说明如何使用最新的Swift/ReactiveSwift/ReactiveCocoa版本实现相同的功能.主要要求是能够在任何我想要的地方取消请求(或处理信号),并在处置时自动取消请求

reactive-cocoa racsignal swift reactive reactive-swift

3
推荐指数
1
解决办法
569
查看次数

Swift 3 协议重载运算符

我有一个声明 type 属性的协议Int。我也有几个符合该要求的类Protocol,现在我需要+为所有这些类重载运算符。由于运算符+将根据声明的属性工作,因此我不想在每个类中单独实现该运算符。

所以我有

protocol MyProtocol {
    var property: Int { get }
}
Run Code Online (Sandbox Code Playgroud)

我想要有类似的东西

extension MyProtocol {
    static func +(left: MyProtocol, right: MyProtocol) -> MyProtocol {
        // create and apply operations and return result
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上我成功地做到了这一点,但尝试使用它时出现错误ambiguous reference to member '+'

当我将运算符重载函数分别移动到每个类时,问题消失了,但我仍在寻找一种解决方案以使其与协议一起使用。

xcode operator-overloading ios swift

0
推荐指数
1
解决办法
977
查看次数