该应用程序有一个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.还有其他方法可以做到这一点吗?或者是测试版中的一个小问题?谢谢!
我正在使用iPhone X并ARFaceKit捕捉用户的脸部.目标是使用用户的图像纹理面部网格.
我只是ARFrame从AR会话中看一帧(一).从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) 我发现UIImageView在两个状态之间设置动画是很棘手的:它的原始矩形框架和用a创建的新形状UIBezierPath.提到了许多不同的技术,其中大部分对我不起作用.
首先是认识到使用UIView块动画不起作用; 显然,无法在animateWithDuration:块中执行子图层动画.(见这里和这里)
剩下的CAAnimation就是具体的子类CABasicAnimation.我很快就意识到,一个人不能从一个没有一个的视图中动画CAShapeLayer(例如,见这里).
并且它们不能只是任何两个形状层路径,而是"动画形状层的路径只能保证在你喜欢的时候动画"(见这里)
有了它,就会出现更普通的问题,例如使用什么fromValue和toValue(它们应该是a CAShapeLayer还是a CGPath?),将动画添加到(layer或者mask?)等等.
似乎有很多变数; 哪个组合会给我我想要的动画?
我有一个处理流媒体视频的应用程序.从.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实例无法播放渐进式下载视频,然后是流式视频?或者可能还有别的我做错了?
我正在编写一个测试应用程序,看看是否可以使用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)
完成处理程序成功返回,但永远不会删除资产.难道我做错了什么?或者我是否试图做一些本身不允许的事情,而我却没有收到正确的反馈意见?
使用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) 我需要将触摸事件捕获到MediaController进度滑块,以便MediaPlayer在手指抬离滑块之前不会发生更新.
[也许我的情况很独特:我正在为每个"节目"播放多个"堆栈"的流媒体视频.在上一个堆栈完成之前,不会加载下一个堆栈.滑块需要表示所有堆栈的持续时间,"拇指"的进度需要表示总持续时间.这是很容易通过覆盖完成getBufferPercentage(),getCurrentPosition()以及getDuration()方法MediaPlayerControl]
更有问题的是沿着时间线来回"擦洗"(移动拇指).如果它导致数据源set多次与seekTo每次移动一起,那么事情会很快陷入困境并崩溃.如果MediaPlayer在用户完成擦除之前没有执行任何操作会更好.
正如其他人所写,是的,最好编写我自己的MediaController实现.但为什么要重做所有这些工作呢?我尝试扩展MediaController,但很快就变得复杂了.我只想抓住滑块的触摸事件!
在 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) 我正在 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)
这很好用,如下所示:
但是,如果我用框架 ( .frame(width: 50, height: 50))取出定义 ZStack 的位,则该行会占据整个屏幕,如下所示。这是为什么?
ios ×4
swift ×3
swiftui ×2
3d ×1
android ×1
animation ×1
arkit ×1
audio ×1
autolayout ×1
avplayer ×1
caanimation ×1
ffmpeg ×1
ios8 ×1
iphone-x ×1
media-player ×1
streaming ×1
uibezierpath ×1
uistackview ×1
video ×1