小编Zba*_*itZ的帖子

无效函数中的意外非空返回值(Swift 2.0)

我一直在浏览StackOverflow问题,试图找出我的代码出错的地方,但我似乎无法做到!我正在尝试将我的Swift 1.2项目转换为Swift 2.0,并且我的类遇到了下载JSON数据的问题.

在void函数中不断收到错误Unexpected non-void返回值.

这是我正在使用的代码,有点截断;

...

class func fetchMinionData() -> [Minion] {

    var myURL = "http://myurl/test.json"

    let dataURL = NSURL(string: myURL)

    let request = NSURLRequest(URL: dataURL!, cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 5.0)

    let session = NSURLSession.sharedSession()

    session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
        let minionJSON = JSON(data!)

        var minions = [Minion]()

        for (_, minionDictionary) in minionJSON {
            minions.append(Minion(minionDetails: minionDictionary))
        }

        return minions
        //THIS IS WHERE THE ERROR OCCURS

    }).resume()
}

...
Run Code Online (Sandbox Code Playgroud)

也许我忽略了一些简单的事情,但我不确定为什么我的功能会被视为无效.任何想法都会非常感激!谢谢!

closures nsurlsession swift

38
推荐指数
2
解决办法
3万
查看次数

从 SwiftUI 视图转到 UIViewController

我正在努力将一些 SwiftUI 内容实施到我现有的应用程序中。我目前有一个 UIViewController,它承载一个用于相机预览的 MTKView。

我创建了一个新的 SwiftUI 视图,它现在是我的视图,如我的SceneDelegate.swift文件中所设置。SwiftUI 视图按预期在启动时加载。现在,我想创建一个 segue,当用户点击我列表中的一行时,它将全屏显示到我现有的 UIViewController。这是我如何称呼它的;

var body: some View {
    VStack {
        NavigationView {
            List(sessionTypes) { session in
                NavigationLink(destination: CameraControllerWrapper()) {
                    SessionRow(session: session)
                    .frame(height: 40.0)
                }
            }
        .navigationBarTitle(Text("Camera Types"))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对于后代,这是我的CameraControllerWrapperUIViewControllerRepresentable;

struct CameraControllerWrapper: UIViewControllerRepresentable {
typealias UIViewControllerType = CameraController

   func makeUIViewController(context: UIViewControllerRepresentableContext<CameraControllerWrapper>) -> CameraControllerWrapper.UIViewControllerType {
    return CameraController()
   }

   func updateUIViewController(_ uiViewController: CameraControllerWrapper.UIViewControllerType, context: UIViewControllerRepresentableContext<CameraControllerWrapper>) {
    //
   }
}
Run Code Online (Sandbox Code Playgroud)

虽然这“有效”,但一旦调用 CameraController,我的应用程序就会崩溃,因为似乎找不到我的任何 IBOutlets。CameraController 是一个内置在故事板中的 UIViewController。

ios swiftui

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

难以在某些设备上将像素缓冲区写入资产编写器

我正在我的应用程序中的一个函数将我的示例缓冲区中的图像写入AVAssetWriter.奇怪的是,这在10.5英寸iPad Pro上运行良好,但在7.9英寸iPad Mini 2上造成了崩溃.我无法理解相同的代码在两个不同的设备上是如何出问题的.但这是我的代码;

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {

    // Setup the pixel buffer image
    let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!

    // Setup the format description
    let formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer)!

    // Setup the current video dimensions
    self.currentVideoDimensions = CMVideoFormatDescriptionGetDimensions(formatDescription)

    // Setup the current sample time
    self.currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer)

    // Handle record
    if self.isCapturing {

        // Setup auto release pool
        autoreleasepool {

            // Setup the output image
            let outputImage = CIImage(cvPixelBuffer: pixelBuffer)

            // …
Run Code Online (Sandbox Code Playgroud)

avfoundation ios swift cvpixelbuffer

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

来自 ARKit 相机框架的纹理 ARMeshGeometry?

这个问题有点建立在这篇文章的基础上,其中的想法是ARMeshGeometry从带有 LiDAR 扫描仪的 iOS 设备中获取数据,计算纹理坐标,并将采样的相机帧应用为给定网格的纹理,从而允许用户创建一个“逼真的”3D 表示他们的环境。

根据那篇文章,我已经调整了其中一个响应来计算纹理坐标,如下所示;

func buildGeometry(meshAnchor: ARMeshAnchor, arFrame: ARFrame) -> SCNGeometry {
    let vertices = meshAnchor.geometry.vertices

    let faces = meshAnchor.geometry.faces
    let camera = arFrame.camera
    let size = arFrame.camera.imageResolution
    
    // use the MTL buffer that ARKit gives us
    let vertexSource = SCNGeometrySource(buffer: vertices.buffer, vertexFormat: vertices.format, semantic: .vertex, vertexCount: vertices.count, dataOffset: vertices.offset, dataStride: vertices.stride)
    
    // set the camera matrix
    let modelMatrix = meshAnchor.transform
    
    var textCords = [CGPoint]()
    for index in 0..<vertices.count {
        let vertexPointer = …
Run Code Online (Sandbox Code Playgroud)

scenekit metal metalkit arkit

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

用渐变笔画绘制一个圆

我正在开展一项任务,我必须创建一个没有填充但是渐变笔划的圆.作为参考,这是我追求的最终结果;

用渐变笔画圈

鉴于应用程序的其他情况,我正在画我的圈子;

let c = UIGraphicsGetCurrentContext()!
c.saveGState()
let clipPath: CGPath = UIBezierPath(roundedRect: converted_rect, cornerRadius: converted_rect.width / 2).cgPath
c.addPath(clipPath)
c.setLineWidth(9.0)
c.setStrokeColor(UIColor.blue.cgColor)
c.closePath()
c.strokePath()
c.restoreGState()
let result = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
Run Code Online (Sandbox Code Playgroud)

这导致具有蓝色笔划的圆圈.尽管在SO周围进行了很多搜索,我仍在努力弄清楚如何setStrokeColor用渐变而不是蓝色替换它.我最大的成功来自于创建一个CAGradientLayer,然后用CAShapeLayer路径创建一个掩盖它,但我只能创建一个实心圆而不是空心圆.

谢谢!

core-graphics ios cagradientlayer swift

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

iOS上的UDP广播/设备发现?

我正在努力尝试开发一种从iOS应用程序在我的本地网络上发现Logitech Harmony Hub设备的方法.这个概念的灵感来自于这个 NODE.JS项目,该项目似乎向该255.255.255.255地址发送了UDP广播,然后获得了Logitech的IP地址(这就是我所追求的).当我在Mac上测试家庭网络上的NODE.JS项目时,它成功找到了Logitech Harmony Hub.

我正在使用CocoaASyncSocket,并且必须承认,我对UDP广播/发现如何工作的理解可能在这里.这就是我正在做的事情;

import UIKit
import CocoaAsyncSocket

class ViewController: UIViewController, GCDAsyncUdpSocketDelegate {

var address = "255.255.255.255"
var port:UInt16 = 5224
var socket:GCDAsyncUdpSocket!
var socketReceive:GCDAsyncUdpSocket!
var error : NSError?

override func viewDidLoad() {
    super.viewDidLoad()

    let message = "_logitech-reverse-bonjour._tcp.local.\n61991".dataUsingEncoding(NSUTF8StringEncoding)

    socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue())
    socket.sendData(message, toHost: address, port: port, withTimeout: 1000, tag: 0)

    do {
        try socket.bindToPort(port)
    } catch {
        print(error)
    }

    do {
        try socket.enableBroadcast(true)
    } catch {
        print(error)
    }

    do …
Run Code Online (Sandbox Code Playgroud)

udp ios cocoaasyncsocket logitech swift

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

在 Swift 中以编程方式启动手势识别器?

我试图确定是否有一种方法可以以编程方式设置手势识别器状态,以强制其在实际检测用户输入之前开始。

例如,当检测到长按时,我将平移手势识别器添加到图像中,如下所示;

let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: "longPressed:")
myImage.addGestureRecognizer(longPressRecognizer)

func longPressed(sender: UILongPressGestureRecognizer) {

   let mainWidth = UIScreen.mainScreen().bounds.width
   let mainHeight = UIScreen.mainScreen().bounds.height

   let myView: UIView(frame: CGRect(x: 0, y: 0, width: mainWidth, height: mainHeight)

   let gestureRecognizer = UIPanGestureRecognizer(target: self, action: "handlePan:")
   myView.addGestureRecognizer(gestureRecognizer)

   self.view.addSubview(myView)

}
Run Code Online (Sandbox Code Playgroud)

在该handlePan()函数中,我能够确定平移何时开始和结束;

func handlePan(gesture: UIPanGestureRecognizer) {

    if gesture!.state == UIGestureRecognizerState.Began {
        print("Started pan")
    }

    if gesture!.state == UIGestureRecognizerState.Ended {
        print("Ended pan")
    }

}
Run Code Online (Sandbox Code Playgroud)

我的问题是,要检测手势何时开始,用户必须(1)长按图像,(2)释放手指,(3)按住并开始平移。理想情况下,我希望用户 (1) 长按图像,(2) 开始平移。

为了实现这一目标,我想我需要找到一种方法来“欺骗”事物,使其相信平移手势已经开始。

注意:实际上,比这里介绍的更复杂,这就是为什么我需要使用平移手势添加子视图,而不是直接将平移手势添加到图像。

uikit ios uipangesturerecognizer swift

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

修改模型以使用 ARBodyTrackingConfiguration (ARKit 3)

我一直在努力学习如何使用 Apple 的示例项目执行 3D 身体跟踪。我的目标是用我自己的 3D 模型替换这个项目中的模型,我已经构建了该模型以匹配该项目中包含的 Apple 可用的“robot.usdz”示例。

在转换为 USDZ 后,我已经成功地将我的 3D 模型导入到 Xcode 中,并将模型附加到 ARBodyAnchor。然而,我的模型(见附件截图)出现在预期的位置,但看起来完全错误。我正在加载模型;

var cancellable: AnyCancellable? = nil
        cancellable = Entity.loadBodyTrackedAsync(named: "character/mytest").sink(
            receiveCompletion: { completion in
                if case let .failure(error) = completion {
                    print("Error: Unable to load model: \(error.localizedDescription)")
                }
                cancellable?.cancel()
        }, receiveValue: { (character: Entity) in
            if let character = character as? BodyTrackedEntity {
                character.scale = [0.5, 0.5, 0.5]
                self.character = character
                cancellable?.cancel()
            } else {
                print("Error: Unable to load model as BodyTrackedEntity") …
Run Code Online (Sandbox Code Playgroud)

augmented-reality arkit arbodyanchor

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

问题获取NSData请求在Swift 2.0中工作

我希望有人可以帮助我弄清楚我正在尝试用Swift 2.0编写(或学习写作)的应用程序.这在以前的Swift 1.2中有效,但经过必要的转换后,我不断面对错误;

无法使用类型为'(contenOfURL:NSURL,options:NSDataReadingOptions,error:nil)的参数列表调用类型为'NSData'的初始值设定项'

这是我的代码,略有截断,我正在使用;

...

class func fetchMinionData() -> [Minion] {
    let myURL = "https://myurl/test.json"

    let dataURL = NSURL(string: myURL)

    let data = NSData(contentsOfURL: dataURL!, options: NSDataReadingOptions.DataReadingMappedIfSafe, error: nil)
    //THIS IS THE LINE THAT THROWS THE ERROR

    let minionJSON = JSON(data)

    var minions = [Minion]()

    for (_ , minionDictionary) in minionJSON {
        minions.append(Minion(minionDetails: minionDictionary))
    }

    return minions
}

...
Run Code Online (Sandbox Code Playgroud)

请注意,我计划在下载数据后使用SwiftyJSON库进一步解析数据.我在网上无休止地搜索,但我似乎无法弄清楚这一点!谢谢!

nsurl nsdata swift2

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

MTKView - 调整纹理大小以填充视图

我对 Metal 非常陌生,但正在努力遵循 Apple 的AVCamFilter示例项目。该项目演示了使用 MTKView 作为 AVCaptureSession 的预览。

我一直未能成功弄清楚如何让我的 MTKView 呈现“全屏”(特别是在 iPhone X、XS 和第三代 iPad Pro 上)。虽然我的约束在故事板中设置正确,但我的相机预览缩放为不同的宽高比,而不是全屏。

作为测试,我设置;

self.clearColor = MTLClearColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)

在我的 MTKView 的 init 中,确认 MTKView 的大小正确(我可以在有问题的区域看到红色背景,但我的相机预览不会拉伸以填充屏幕)。

我相信我的问题存在于这个计算中;

// Calculate scale.
if textureWidth > 0 && textureHeight > 0 {
  switch textureRotation {
    case .rotate0Degrees, .rotate180Degrees:
      scaleX = Float(internalBounds.width / CGFloat(textureWidth))
      scaleY = Float(internalBounds.height / CGFloat(textureHeight))

    case .rotate90Degrees, .rotate270Degrees:
      scaleX = Float(internalBounds.width / CGFloat(textureHeight))
      scaleY = Float(internalBounds.height / CGFloat(textureWidth)) …
Run Code Online (Sandbox Code Playgroud)

avfoundation ios swift metal metalkit

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