小编coc*_*oco的帖子

SwiftUI 从视图更新中发布环境更改

该应用程序有一个model存储用户当前对亮/暗模式的偏好,用户可以通过单击按钮来更改:

class DataModel: ObservableObject {
    @Published var mode: ColorScheme = .light
Run Code Online (Sandbox Code Playgroud)

ContentViewbody跟踪模型,并在模型更改时调整 colorScheme:

struct ContentView: View {
    @StateObject private var dataModel = DataModel()

var body: some View {
        NavigationStack(path: $path) { ...
        }
        .environmentObject(dataModel)
        .environment(\.colorScheme, dataModel.mode)
Run Code Online (Sandbox Code Playgroud)

从 Xcode 版本 14.0 beta 5 开始,这会产生一个紫色警告:Publishing changes from within view updates is not allowed, this will cause undefined behavior.还有其他方法可以做到这一点吗?或者是测试版中的一个小问题?谢谢!

environment-variables swiftui

20
推荐指数
1
解决办法
8620
查看次数

将图像映射到3D面部网格上

我正在使用iPhone X并ARFaceKit捕捉用户的脸部.目标是使用用户的图像纹理面部网格.

我只是ARFrameAR会话中看一帧(一).从ARFaceGeometry,我有一组描述脸部的顶点.我制作了当前帧的jpeg表示capturedImage.

然后我想找到将创建的jpeg映射到网格顶点的纹理坐标.我想:1.将顶点从模型空间映射到世界空间; 2.将顶点从世界空间映射到摄像机空间; 3.除以图像尺寸以获得纹理的像素坐标.

let geometry: ARFaceGeometry = contentUpdater.faceGeometry!
let theCamera = session.currentFrame?.camera

let theFaceAnchor:SCNNode = contentUpdater.faceNode
let anchorTransform = float4x4((theFaceAnchor?.transform)!)

for index in 0..<totalVertices {
    let vertex = geometry.vertices[index]

    // Step 1: Model space to world space, using the anchor's transform
    let vertex4 = float4(vertex.x, vertex.y, vertex.z, 1.0)
    let worldSpace = anchorTransform * vertex4

    // Step 2: World space to camera space
    let world3 = float3(worldSpace.x, worldSpace.y, …
Run Code Online (Sandbox Code Playgroud)

3d augmented-reality ios arkit iphone-x

19
推荐指数
2
解决办法
1066
查看次数

两个贝塞尔路径形状之间的动画

我发现UIImageView在两个状态之间设置动画是很棘手的:它的原始矩形框架和用a创建的新形状UIBezierPath.提到了许多不同的技术,其中大部分对我不起作用.

首先是认识到使用UIView块动画不起作用; 显然,无法在animateWithDuration:块中执行子图层动画.(见这里这里)

剩下的CAAnimation就是具体的子类CABasicAnimation.我很快就意识到,一个人不能从一个没有一个的视图中动画CAShapeLayer(例如,见这里).

并且它们不能只是任何两个形状层路径,而是"动画形状层的路径只能保证在你喜欢的时候动画"(见这里)

有了它,就会出现更普通的问题,例如使用什么fromValuetoValue(它们应该是a CAShapeLayer还是a CGPath?),将动画添加到(layer或者mask?)等等.

似乎有很多变数; 哪个组合会给我我想要的动画?

animation caanimation ios uibezierpath swift

7
推荐指数
2
解决办法
8924
查看次数

AVPlayer不在渐进式下载和流式传输之间切换

我有一个处理流媒体视频的应用程序.从.m3u8播放列表开始,它会创建一个AVAssets数组,并通过它们翻转

[player replaceCurrentItemWithPlayerItem:[AVPlayerItem playerItemWithAsset:[assetItems objectAtIndex:index]]]
Run Code Online (Sandbox Code Playgroud)

这很好,但在此之前,我想用渐进式下载播放短的mp4视频.我使用加载AVPlayer

AVAsset *prerollAsset = [AVAsset assetWithURL:prerollURL];
[player replaceCurrentItemWithPlayerItem:[AVPlayerItem playerItemWithAsset:prerollAsset]];
Run Code Online (Sandbox Code Playgroud)

它播放,但当我像以前一样继续播放流视频时,我得到AVPlayerStatusFailed的状态,AVPlayerItem中的错误 The operation could not be completed

为了它的工作,我需要为(渐进式下载)预卷创建一个AVPlayer对象,然后创建一个全新的AVPlayer对象来开始播放流式视频.

是否有可能单个AVPlayer实例无法播放渐进式下载视频,然后是流式视频?或者可能还有别的我做错了?

video streaming ios avplayer

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

使用Photos框架删除相机胶卷资产

我正在编写一个测试应用程序,看看是否可以使用Photos框架删除iOS 8中的"照片库"资产.虽然我怀疑这是不可能的,但我发现文档不清楚,并且该网站上的帖子似乎表明它是可能的.例如,见这里.

在我的测试应用程序中,我从库中选择一个资产:

var picker = UIImagePickerController()
picker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
picker.mediaTypes = [kUTTypeMovie]
Run Code Online (Sandbox Code Playgroud)

在委托回调中,我获取资产的NSURL,并将其放入数组中:

let thePicked = info[UIImagePickerControllerMediaURL] as NSURL!
var videosToDelete: [NSURL] = [theURL]
Run Code Online (Sandbox Code Playgroud)

这是我最不自信的部分,我在哪里获得PhotoLibrary,并执行更改请求以删除资产:

PHPhotoLibrary.sharedPhotoLibrary().performChanges( {
    let assetToDelete = PHAsset.fetchAssetsWithALAssetURLs(videosToDelete, options: nil)
    PHAssetChangeRequest.deleteAssets(assetToDelete)
},
    completionHandler: { success, error in
        NSLog("Finished deleting asset. %@", (success ? "Success" : error))
})
Run Code Online (Sandbox Code Playgroud)

完成处理程序成功返回,但永远不会删除资产.难道我做错了什么?或者我是否试图做一些本身不允许的事情,而我却没有收到正确的反馈意见?

swift ios8 photosframework

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

使用 ffmpeg 更改复杂的音频音量

使用ffmpeg,我们可以对音频电平进行多少控制?例如,我想在程序的时间线上映射一个“M”形:

t0 - t1 : fade in from 0 to 1
t1 - t2 : play at full volume
t2 - t3 : fade out to 25%
t3 - t4 : play at 25% volume
t4 - t5 : fade in (from 25%) to full volume
t5 - t6 : play at full volume
t6 - t7 : fade out from 1 to 0
Run Code Online (Sandbox Code Playgroud)

这能做到吗?我尝试过的组合(淡化和音量,以及使用时间线编辑)到目前为止还没有成功。

这是接近的事情:

ina="infile.caf"
out="outfile.mp3"

time ffmpeg -i $ina -af \
"afade=enable='between(t,0,3)':t=in:ss=0:d=3, \
afade=enable='between(t,7,8)':t=out:st=7:d=1, \ …
Run Code Online (Sandbox Code Playgroud)

audio ffmpeg

4
推荐指数
2
解决办法
1796
查看次数

控制MediaController进度滑块

我需要将触摸事件捕获到MediaController进度滑块,以便MediaPlayer在手指抬离滑块之前不会发生更新.

[也许我的情况很独特:我正在为每个"节目"播放多个"堆栈"的流媒体视频.在上一个堆栈完成之前,不会加载下一个堆栈.滑块需要表示所有堆栈的持续时间,"拇指"的进度需要表示总持续时间.这是很容易通过覆盖完成getBufferPercentage(),getCurrentPosition()以及getDuration()方法MediaPlayerControl]

更有问题的是沿着时间线来回"擦洗"(移动拇指).如果它导致数据源set多次与seekTo每次移动一起,那么事情会很快陷入困境并崩溃.如果MediaPlayer在用户完成擦除之前没有执行任何操作会更好.

正如其他人所写,是的,最好编写我自己的MediaController实现.但为什么要重做所有这些工作呢?我尝试扩展MediaController,但很快就变得复杂了.我只想抓住滑块的触摸事件!

android video-streaming media-player mediacontroller

2
推荐指数
1
解决办法
6729
查看次数

UIStackView 在 iOS 12 中运行良好,但不适用于 iOS 11

在 iOS 12 中,我的水平堆栈视图(包含三个元素)布局很好:

在此处输入图片说明

但在 iOS 11 中,这三个元素相互叠加:

在此处输入图片说明

这是保存集合视图的视图控制器,其中一行包含堆栈:

struct TestStackConstants {
    static let rowHeight:CGFloat = 200.0
    static let heightPerHoursLine:CGFloat = 16.0
}

public struct OpenHours: Equatable {
    public let instrument: String
    public let openStrings: [String] // ex: ["00:00 - 17:00", "17:15 - 24:00"]
    public let dayOfWeek: String // ex: Wednesday
    public let timeZone: String // ex: GMT-04:00
}

class TSViewController: UIViewController {

    fileprivate var extendedCollection: UICollectionView!
    fileprivate var myTimeZone = "GMT-0:400"
    fileprivate var dailyHours = [OpenHours]()

    override func viewDidLoad() …
Run Code Online (Sandbox Code Playgroud)

ios autolayout swift uistackview

2
推荐指数
1
解决办法
526
查看次数

SwiftUI ZStack 和 GeometryReader

我正在 SwiftUI 中创建一个简单的视图,一个有一条线穿过它的盒子。这是(工作)代码:

struct DrawLine: View {
    let boxSize = CGFloat(300.0)

    var body: some View {
        ZStack {
            Rectangle()
                .stroke(lineWidth: 2.0)
                .fill(Color.purple)
                .frame(width: self.boxSize, height: self.boxSize, alignment: .center)## Heading ##

            GeometryReader { geometry in
                Path { path in
                    path.move(to: CGPoint(x: 1, y: 1))
                    path.addLine(to: CGPoint(x: geometry.size.width - 1, y: geometry.size.height - 1))
                }
                .stroke(lineWidth: 2)
                .fill(Color.orange)
            }
        }
        .frame(width: 50, height: 50).border(Color.black)
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用,如下所示:

带框架的 ZStack

但是,如果我用框架 ( .frame(width: 50, height: 50))取出定义 ZStack 的位,则该行会占据整个屏幕,如下所示。这是为什么?

在此处输入图片说明

swiftui

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