在应用程序中,我有一个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文件.
我是Swift的新手(不到一整年),我不知道如何在每年的新Xcode中更新到最新的Swift.我的项目已开始下Xcode 8和Swift 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?
我有一个包含多个目标的项目,它们代表相同的应用程序,只是具有不同的样式和翻译.
由于几乎整个项目对于每个目标看起来都是一样的,我需要在Localizable.strings文件中只有几个字符串,我需要不同.而且我不想将整个巨大的Localizable.strings文件复制到每个项目,因为它几乎没有不同的行.
由于项目中包含第三方库/ SDK,因此我只需要1个字符串文件.所以我不能使用tableName的localizedString.
该问题是-我需要有一个灵活的可能性,以覆盖从只有几行Localizable.strings对单独每一个目标.而且我不喜欢将整个文件复制到每个目标的想法,因为它将导致将来烦人的流量,如果我将有10个目标并且我需要为所有目标添加1个字符串.
该目标是有1个巨大Localizable.strings与包括所有字符串,这将是通用于所有的目标文件,并为每个目标的字符串应该告诉不同的小配置.所以目标的文件应该合并并覆盖常见的文件.
AFAIK它本身不受Xcode的支持,所以我可能正在寻找一个可以使它工作的脚本.
因此,脚本应该查看common和target的Localizable文件,合并它们,如果在两者中都定义了一些键,那么它应该使用target的文件中的一个.
任何人都可以帮我这样的脚本吗?
PS存在类似的问题.xcassets,并且CocoaPods通过将多个资产合并为1来解决它,并且它按预期工作 - 如果某些目标的资产包含已包含在公共资产中的同名图像,那么目标中的一个将取代它.
PS2.Android开发人员本身也支持类似的功能 - 每个图像,每个翻译都可以被"孩子"的瑕疵或者其他任何名称所覆盖:)
我有一个UITableViewCell包含UISwitch. 这个单元格有它自己的SwitchCellViewModel. 假设它包含一些Bool值(启用与禁用)。并且ViewController是包含UITableView,viewModel为单元格创建并用它设置单元格的人。
我想实现:
用例是下一个:单元格显示一些可以禁用或启用的选项。该操作进入后端,在我收到带有结果的响应(在后端启用与禁用)后,我必须再次将视图状态与更新的数据同步。
我了解如何在单元格级别订阅属性值更改,因此当我从 viewController 在 viewModel 中更改它时,它会立即更新单元格视图。但我不确定如何处理从UISwitchviewController返回的动作。
是否可以通过@PublishedviewModel 中的单个bool 属性实现,或者对于这种双向情况,我必须有 2 个单独的东西。
我必须Publisher为此目的公开一个单独的@Published属性,这对我来说看起来很愚蠢,因为我已经在 viewmodel 中有一个属性,应该通知该视图控制器,所以我为什么不使用它。但是如果我只使用一个,那么情况就是 ViewController@Published在 viewModel 中设置var,cell 本身会处理它并调整 UI,但 ViewController 也会立即获取有关它的事件,因为它已订阅它。
我正在尝试使用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上有一些更新...
我认为我们所有人都有一项创建任务,viewController其中包含大量内容,其中大部分内容都是自我调整的,而最底层则表明你需要展示一些tableView包含很多内容的内容......
可以做的第一个解决方案是使用UIScrollView,而根本不关心reusableCells.
所述第二是使用UITableView的headerView并手动调整其高度(或通过调用systemLayoutSizeFittingSize:在需要时)各一次.
也许第三解决方案是使用UITableView和自我尺寸UIView分别与具有UIEdgeInsets上tableView.并根据什么物体上具有较高的"zIndex的",它可以带来与处理的交互问题......
的规定解决方案是使用电池上面全部内容,就像一个独立的单元.根本不确定这是个好主意......
问题:这个问题有新的解决方案吗?我没有深入研究它2年......也许在新的iOS中有类似reusableViews的东西UIScrollView...当然,目标是拥有可重复使用的单元格,并使用自动布局标题而无需手动更新其高度...
我正在使用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) 我已经开始使用UIViewControllerAnimatedTransitioning协议学习自定义过渡动画.我们在youtube上找到的所有视频都是基于流程的,当我们有新的ViewController呈现圆形动画或类似的时候.
我在实现转换方式时遇到问题.大多数情况下,我需要的是类似于facebook应用程序以及它们如何打开全屏图像查看器.
所以,让我们说我们有 VC1和VC2.在VC1我们所说的行动提出VC2.在两者上VC我们都有相同的UI元素.就我而言UIImageView.就像你点击imageView就VC1和它打开详细信息页面,其顶部图像的一些对象.我希望有动画,看起来像是将图像从VC1框架更改为图像的最终帧VC2,然后应该出现详细页面上的其他内容(如标签,按钮等).
但是我在训练中遇到了一些问题.
1.首先,我不明白的想法containerView的transitionContext.但正如我所看到的,它就像转换之间的中间状态.那是对的吗?但这对我来说很奇怪,因为即使是backgroundColor不起作用的财产containerView.
2.我不明白在转换过程中我需要做什么动画,以及containerViewsubViews 的结构应该是什么.在我的例子中,在演示时VC2,我需要,据我所知,有点隐藏其所有子视图.然后将imageView 从from VC1框架设置为动画,然后再次显示所有子视图.那么,在这种情况下应该添加到containerView?如果是这样,那么它应该是实际的,或者是imageView的全新副本,具有相同的帧/图像,只是在转换过程中暂时使用... imageViewVC2imageViewimageViewVC1
将我链接到带有类似动画的examples/tutorial/code会很有帮助
我是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版本实现相同的功能.主要要求是能够在任何我想要的地方取消请求(或处理信号),并在处置时自动取消请求
我有一个声明 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 '+'。
当我将运算符重载函数分别移动到每个类时,问题消失了,但我仍在寻找一种解决方案以使其与协议一起使用。
ios ×9
swift ×8
xcode ×4
racsignal ×2
avfoundation ×1
avplayer ×1
combine ×1
localization ×1
mvvm ×1
reactive ×1
swift4 ×1
uikit ×1
uiscrollview ×1
uitableview ×1
xcode9 ×1