小编Nic*_*ari的帖子

- [EAGLContext renderbufferStorage:fromDrawable:]第二次失败?

我正在开发一个iOS openGL ES应用程序.

我正在做通常的EAGLView/ES2Render.

在启动时,使用以下代码创建frambuffer成功:

- (BOOL) createFramebuffers
{
    [EAGLContext setCurrentContext:_mainContext];

    // [ A ] On-screen  

    // 1. Framebuffer
    glGenFramebuffers(1, &_mainFramebuffer);
    bindFramebuffer(_mainFramebuffer);

    // 2. Color buffer
    glGenRenderbuffers(1, &_mainColorbuffer);
    bindRenderbuffer(_mainColorbuffer);

    // Adjust size to view's layer:
    CAEAGLLayer* layer = (CAEAGLLayer*)[_view layer];

    if (![_mainContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer]) {
        // something went horribly wrong
        NSLog(@"-[ES2Renderer createFramebuffers]: Failed to obtain renderbuffer storage from layer!");
        return NO;
    }

    // Query new size:
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH,  &_backingWidth);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_backingHeight);

    // Attach to color:
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _mainColorbuffer); …
Run Code Online (Sandbox Code Playgroud)

framebuffer eaglcontext ios opengl-es-2.0

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

使用ObjectIdentifier()和'==='运算符之间的区别

假设我在Swift中实现了一个根类,我声明它采用了Equatable协议(我希望能够判断我的类型的数组是否包含给定的实例).

有什么区别 - 在这种特定情况下 - 在实现协议所需的==运算符之间有什么区别:

public static func ==(lhs: MyClass, rhs: MyClass) -> Bool {

    return ObjectIdentifier(lhs) == ObjectIdentifier(rhs)
}
Run Code Online (Sandbox Code Playgroud)

......而不是这样做:

public static func ==(lhs: MyClass, rhs: MyClass) -> Bool {

    return (lhs === rhs)
}
Run Code Online (Sandbox Code Playgroud)

作为参考,这是文档所说的ObjectIdentifier():

类实例或元类型的唯一标识符.在Swift中,只有类实例和元类型具有唯一的标识.结构,枚举,函数或元组没有身份概念.

......这就是Swift编程语言(Swift 3)的"基本操作符"部分对===运算符的说法:

注意

Swift还提供了两个标识运算符(===!==),用于测试两个对象引用是否都引用同一个对象实例.有关更多信息,请参阅类和结构.

swift equatable

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

将 MTLTexture 转换为 CVPixelBuffer

我目前正在使用 Metal 开发实时滤波器。定义 CIImage 后,我将图像渲染到 MTLTexture。

下面是我的渲染代码。context是 Metal 支持的 CIContext; targetTexture是附加到我的 MTKView 实例属性的纹理的别名currentDrawable

context?.render(drawImage, to: targetTexture, commandBuffer: commandBuffer, bounds: targetRect, colorSpace: colorSpace)

它渲染正确,因为我可以看到金属视图上显示的图像。

问题是,在渲染图像(并显示它)之后,我想提取 CVPixelBuffer 并使用 AVAssetWriter 类将其保存到磁盘。

另一种替代方案是有两个渲染步骤,一个渲染到纹理,另一个渲染到 CVPixelBuffer。(但尚不清楚如何创建这样的缓冲区,或者两个渲染步骤对帧速率的影响)

任何帮助将不胜感激,谢谢!

core-image avfoundation ios swift metal

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

来自测试目标中资产目录的 NSImage

我的单元测试目标需要加载用于某些测试的图像资源,但我无法加载它。

  1. 我在测试目标中创建了一个资产目录
  2. 我在目录中添加了一个新的图像集资源,选中了“设备”中的“Mac”框,并将其源图像设置为两种分辨率(@1x 和 @2x):

在此处输入图片说明

  1. 我已经检查了测试目标的“复制捆绑资源”构建阶段,它确实包含资产目录。

  2. 我检查了资产目录和图像集的目标成员资格,确实是测试目标。


运行测试时,我尝试使用如下代码加载图像:

guard let image = NSImage(named: NSImage.Name("TestSourceImage")) else {
    fatalError("Test Resource is Missing.")
}
Run Code Online (Sandbox Code Playgroud)

...但守卫失败了。

我也试过:

let bundle = Bundle(for: MyClassTests.self)

guard let path = bundle.pathForImageResource(NSImage.Name("TestSourceImage")) else {
    fatalError("Test Resource is Missing.")
}

guard let image = NSImage(contentsOfFile: path) else {
    fatalError("Test Resource File is Corrupt.")
}
Run Code Online (Sandbox Code Playgroud)

...但第一个守卫失败(无法检索资源路径)。

两种格式我都试过了

NSImage.Name("TestSourceImage")
Run Code Online (Sandbox Code Playgroud)

和:

NSImage.Name(rawValue: "TestSourceImage")
Run Code Online (Sandbox Code Playgroud)

我也试过Bundle.urlForImageResource(_),但它也失败了。


我见过类似的问题和答案,但它们适用于iOS应用程序(主)包中的资源。

我错过了什么?


更新:

在meantine,我身边工作过的问题,加入我的测试图像作为独立的图像资源(使用的资产目录),并用下面的代码加载它:

let …
Run Code Online (Sandbox Code Playgroud)

macos nsimage asset-catalog xctestcase

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

registerForRemoteNotifications() 回调未被调用

有人问过这个问题(例如这里这里),但似乎没有一个解决方案适用于我的设置。

我正在 iOS 9 / Xcode7 (beta 5) 中开发一个应用程序。

我创建了一个显式的 App ID/包标识符。(应用程序 ID 由 Xcode 自动生成,但在 Developer Portal 中作为 收听Xcode iOS App ID com mycompanyname mayappname)。

我已在 Xcode 中配置了目标的“功能”以添加对推送通知的支持。

我已经在开发者门户中配置了我的 App ID 以支持推送通知:我创建并下载了一个开发 APNs 证书,并安装在我的钥匙串中(不确定这是不是需要?我认为这个证书是为我的服务器准备的?但只是为了如果在构建时需要它是安全的吗?)

我正在设备上从 Xcode 运行应用程序:iPhone 5s、iOS 9、4G 连接、Wi-Fi 关闭(以防万一)。

我的应用程序未列在设备的 Settings.app 的“通知”部分中,因此我无法在那里启用任何内容...

我像这样启动注册过程:

func application(application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?
        ) -> Bool
{
    application.registerForRemoteNotifications()
        
    return true
}
Run Code Online (Sandbox Code Playgroud)

我已经实现了两个:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData)
{

}
Run Code Online (Sandbox Code Playgroud)

...和:

func application(application: UIApplication, …
Run Code Online (Sandbox Code Playgroud)

apple-push-notifications ios9 xcode7

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

无法使用Postman将POST变量发送到localhost上的php脚本

我正在iOS/Swift中开发Web应用程序的客户端,现在我正在测试与服务器通信的部分.我在localhost上设置了一个基本网站:

http://localhost/~username/ConnectivityTest/login

(对应/Users/username/Sites/ConnectivityTest/login于我的Mac文件系统).

服务器端脚本(index.php在上面的目录中)是:

<?PHP
    $userId   = $_POST["userId"];
    $password = $_POST["password"];

    if (empty($userId) || empty($password)){

        echo "Error: empty post variables";
    }
    else{
        // Process credentials...
Run Code Online (Sandbox Code Playgroud)

NSURLSession在iOS上使用API,但我注意到无论我如何配置我的请求,即使连接成功(即返回http代码200和响应正文作为数据),POST变量也不可用(空)服务器端.

所以我决定尝试在浏览器上使用Postman手动发送请求(试图排除我的iOS/Swift代码上的任何错误),但我不知道应该如何配置它(我不熟悉HTTP,它一切都让我有点困惑):

  1. 我应该设定的Content-Typeapplication/json,application/x-www-form-urlencoded或者是什么?

  2. 我应该将身体数据发送为form-data, x-www-form-urlencoded还是raw

在Postman中,我将身体数据(原始)设置如下:

{
    "userId":"my-user-name",
    "password":"123456"
}
Run Code Online (Sandbox Code Playgroud)

Alternativley,因为form-data它是:

userId     my-user-name      [Text]
password   12345             [Text]
Run Code Online (Sandbox Code Playgroud)

因为x-www-form-urlencoded,它是:

userId     my-user-name      
password   12345        
Run Code Online (Sandbox Code Playgroud)

我尝试的一切都给了我"Error: empty post variables"在代码的错误路径中设置的响应(即,$_POST['userId']或者$_POST['password']为空). …

php post http postman

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

为任意的、基于整数的枚举定义 Swift 协议

我有这个代表颜色的枚举,并且我添加了几种方法来方便地获取基于原始原始值的算术运算的新实例:

enum Color : Int
{
    case Red = 0
    case Green
    case Blue

    case Cyan
    case Magenta
    case Yellow


    static func random() -> Color
    {
        return Color(rawValue: Int(arc4random_uniform(6)))!
    }

    func shifted(by offset:Int) -> Color
    {
        return Color(rawValue: (self.rawValue + offset) % 6)!
        // Cyclic: wraps around
    }
}
Run Code Online (Sandbox Code Playgroud)

(这可以追溯到旧的枚举只是 int 常量)

问题是,我还有其他几个基于 int 的枚举,我想在其中引入类似的功能,但不重复代码。

我想我应该在RawRepresentablewhere上定义一个协议扩展RawValue == Int

extension RawRepresentable where RawValue == Int
{
Run Code Online (Sandbox Code Playgroud)

...但这就是我对语法的理解结束的地方。

理想情况下,我想要一个返回案例数量的静态方法,并提供一个考虑到这一点的两个random()shifted(_:)以上的默认实现(而不是这里的硬编码 6)。

结论:我接受了 Zoff …

enums protocols swift rawrepresentable

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

带有约束的泛型类型关联值的枚举大小写

有没有办法使用泛型和类型约束将前两种情况enum合并为一个?

enum AllowedValueRange {

    // Associated value represents (min, max). 'nil' represents
    // "no limit" for that interval end (+/- infinity)
    case IntegerRange(Int?, Int?)


    // Associated value represents (min, max). 'nil' represents
    // "no limit" for that interval end (+/- infinity)
    case FloatRange(Float?, Float?)


    // A finite set of specific values of any type
    case ArbitrarySet([Any])

    // (...Other cases with different structure of associated values
    // or no associated values...)
}
Run Code Online (Sandbox Code Playgroud)

附录: 我知道我可以为整个 指定一个泛型类型enum,但只有这两种类型需要一个。另外,我认为它需要同时符合Equatableand …

generics enums swift

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

Swift Codable - 如何以可失败的方式初始化可选的枚举属性

我正在尝试Codable为一个对象采用协议,该对象必须从我的 Web 服务返回的 JSON 实例化以响应 API 调用之一。

其中一个属性是枚举类型,可选:nil表示没有选择 定义的任何选项enum

enum常数Int为基础的,并在开始1不是 0

class MyClass: Codable {

    enum Company: Int {
        case toyota = 1
        case ford
        case gm
    } 
    var company: Company?
Run Code Online (Sandbox Code Playgroud)

这是因为0相应 JSON 条目上的值是为“未设置”保留的;即nil在设置初始化company属性时应该映射到它。

Swift 的 enum 初始值设定项init?(rawValue:)提供了开箱即用的此功能:Int与任何情况下的原始值都不匹配的参数将导致初始值设定项失败并返回 nil。此外,Int可以Codable通过在类型定义中声明它来使基于 (和 String) 的枚举符合:

enum Company: Int, Codable {
    case toyota = …
Run Code Online (Sandbox Code Playgroud)

enums optional swift codable

6
推荐指数
3
解决办法
3516
查看次数

AVFoundation 在导出带有文本层的视频时崩溃

我正在业余时间为 iOS 开发一个视频编辑应用程序。

在参加其他 rpojects 几周后,我刚刚恢复工作,并且 - 即使我没有对代码进行任何重大更改 -现在每次我尝试导出我的视频作品时它都会崩溃

我检查并构建了我当时成功上传到 TestFlight 的完全相同的提交(并且它在多个设备上工作而没有崩溃),所以这可能是我从那时起更新的最新 Xcode / iOS SDK 的问题?

代码在_xpc_api_misuse上崩溃,在一个线程上:

com.apple.coremedia.basicvideocompositor.output
Run Code Online (Sandbox Code Playgroud)

调试导航器:

在此处输入图片说明

在崩溃时,调试导航器上有 70 多个线程,所以可能出现问题并且应用程序使用了太多线程(从未见过这么多)。


我的应用程序使用文本层在导出的视频上覆盖“水印”。玩了一圈后,我发现如果我注释掉水印代码,可以避免崩溃:

    guard let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality) else {
        return failure(ProjectError.failedToCreateExportSession)
    }
    guard let documents = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) else {
        return failure(ProjectError.temporaryOutputDirectoryNotFound)
    }
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd_HHmmss"
    let fileName = dateFormatter.string(from: Date())
    let fileExtension = "mov"
    let fileURL = …
Run Code Online (Sandbox Code Playgroud)

avfoundation ios avcomposition

6
推荐指数
3
解决办法
623
查看次数