小编Vad*_*ick的帖子

如何检查iOS中的视图层次结构?

是否有GUI工具检查iOS应用程序的视图层次结构?我正在考虑Webkit的Web检查器或类似的工具.我正在调试布局问题,例如具有错误位置或大小的视图,或者未正确包含其父级的子级.目前我必须添加断言,手动测试这些不同的条件,或者在不同的视图上设置不同的背景颜色,并且你可以想象,这是一个非常繁琐的方法.

我查看了仪器UI recorder,但它只记录和播放UI动作,并且无论如何,仅适用于Mac应用程序.

有更好的解决方案吗?

cocoa-touch uikit ios

167
推荐指数
8
解决办法
8万
查看次数

一个iOS应用程序可以使用多少内存?

......当它在前景时.

对于拥有256MB RAM的原始iPad,我发现我的应用程序在被杀之前最多可以使用100-140MB.

现在的情况如何?我可以去买一堆iDevices并自己做一个测试,但我想检查一下:有人做过测试吗?

我知道这没有一个确切的答案,而且我正在寻找一个范围,例如:"应用程序在512MB设备上使用300-350MB时就会被杀死.你可以安全地使用高达300MB."

特别:

  1. 在具有512MB内存的设备上,一个应用程序可以使用多少?

  2. 在具有1GB内存的设备上,一个应用程序如何使用?

  3. 以上是否有区别?为了在后台保留一些应用程序,每个应用程序是否限制为固定数量的内存,或者前台应用程序可以从内存中踢出所有后台应用程序,并将整个1GB(或512MB)带到自身(以及OS,当然)?

  4. 该设备是iPad还是iPhone?如果我让我的应用程序在具有512MB内存的iPad上运行,是否意味着它也适用于具有512MB内存的iPhone,反之亦然?我知道UIViews和他们的核心动画支持商店会因为更大的屏幕尺寸而在iPad上占用更多内存,但除此之外,iPhone和具有相同内存的iPad之间的内存情况是否相同?

我指的是进程使用的总内存 - 堆,堆栈,静态数据,代码,Core Animation后备存储等.

如果您倾向于说它取决于操作系统版本,您可以假设我们正在谈论iOS 7.

我知道使用太多内存意味着当我的应用程序进入后台时,iOS会更快地终止它.我现在对这个权衡很好.

memory iphone ipad ios ios7

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

UILabel的sizeToFit/sizeThatFits忽略numberoflines属性

问题:UILabel假设宽度为300像素,确定所需的尺寸(线数).字符串更长,所以我设置为lineBreakModeto UILineBreakModeWordWrap并调用sizeThatFits以尝试确定大小.但它在一行中给出了457像素的宽度,而不是两行中预期的300像素.

请参阅:

CGSize available = CGSizeMake(300, INFINITY);
UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 400)] autorelease];
label.text = title;
label.lineBreakMode = UILineBreakModeWordWrap;
label.font = [UIFont fontWithName:kBoldFont size:kTitleFontSize];
label.numberOfLines = 3;
CGSize sizedtoFit = [label sizeThatFits:available];
Run Code Online (Sandbox Code Playgroud)

但我发现sizetoFit变量的宽度为457像素,高度为22像素,UI显示一条带有剪切文本的行.我预计宽度为300像素,两条线的高度为44像素.

数字线的UILabel文档说:

使用该sizeToFit方法调整接收器大小时,调整大小会考虑存储在此属性中的值.例如,如果此属性设置为3,则该sizeToFit方法会调整接收器的大小,使其足够大以显示三行文本.

我尝试了各种组合:

  1. 传递CGRectZero给init函数,传递300x400或300 x无穷大.
  2. 在创建后设置框架而不是将其传递给init函数.
  3. 调用[sizeToFit]并希望它计算假设当前宽度的高度,但事实并非如此.
  4. 调用sizeToFit然后调用sizeThatFits`.
  5. 调用layoutIfNeeded.

它们都不起作用.我做错了什么,或者这是文档和框架实现不一致的错误?谢谢.

iphone cocoa-touch

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

我在iOS中使用什么设置来捕获RAW而不降低噪声,但看起来与BGRA相同?

我们可以要求AVFoundation以BGRA等处理格式捕获照片,或要求它捕获RAW,然后使用Core Image将其处理到BGRA.后者让我们控制过程中使用的参数,而不是让它保持iOS使用的默认值.

在我的情况下,我想关闭降噪,但其他方面的图像与BGRA相似.所以我尝试过:

let rawData = AVCapturePhotoOutput.dngPhotoDataRepresentation(forRawSampleBuffer: self,
                                                                     previewPhotoSampleBuffer: nil)!
let options: [AnyHashable : Any] = [
  kCIInputNoiseReductionAmountKey: 0.0,
  kCIInputLuminanceNoiseReductionAmountKey: 0.0,
  kCIInputColorNoiseReductionAmountKey: 0.0]

let rawFilter = CIFilter(imageData: rawData, options: options)!
let outputImage = rawFilter.outputImage!
let context = CIContext()
let cgImage = context.createCGImage(outputImage, from: outputImage.extent)!
let uiImage = UIImage(cgImage: cgImage)
let data = UIImageJPEGRepresentation(uiImage, jpegQuality)!
// Save the data using PHPhotoLibrary
Run Code Online (Sandbox Code Playgroud)

但这会导致看起来更亮的RAW ......

在此输入图像描述

......比BGRA:

在此输入图像描述

右键单击照片并在新选项卡中打开以查看差异.

这只是一张照片,作为一个例子.我测试了许多不同的场景,发现无论我尝试什么设置,我都无法匹配JPEG的质量 - 它太亮,太暗,或者对比度太大等等.

然后我注意到有一个输入boost参数,默认值为1表示完全提升,所以我将其设置为0:

let options: [AnyHashable: Any] = [kCIInputBoostKey: 0.0]
Run Code Online (Sandbox Code Playgroud)

但这产生了一个没有足够对比度的暗淡图像:

在此输入图像描述

因此,问题是我应该使用什么设置让Core Image以与AVFoundation捕获的BGRA相同的视觉外观开发RAW到BGRA,除非没有降噪.

iphone avfoundation ios dng cifilter

11
推荐指数
0
解决办法
325
查看次数

为什么Vision框架无法对齐两个图像?

我正在尝试使用相机拍摄两张图像,并使用iOS Vision框架对齐它们:

func align(firstImage: CIImage, secondImage: CIImage) {
  let request = VNTranslationalImageRegistrationRequest(
      targetedCIImage: firstImage) {
    request, error in
    if error != nil {
      fatalError()
    }
    let observation = request.results!.first
        as! VNImageTranslationAlignmentObservation
    secondImage = secondImage.transformed(
        by: observation.alignmentTransform)
    let compositedImage = firstImage!.applyingFilter(
        "CIAdditionCompositing",
        parameters: ["inputBackgroundImage": secondImage])
    // Save the compositedImage to the photo library.
  }

  try! visionHandler.perform([request], on: secondImage)
}

let visionHandler = VNSequenceRequestHandler()
Run Code Online (Sandbox Code Playgroud)

但这会产生严重错位的图像:

在此输入图像描述

在此输入图像描述

在此输入图像描述

您可以看到我尝试了三种不同类型的场景 - 特写主题,室内场景和室外场景.我尝试了更多的室外场景,几乎每一个场景的结果都是一样的.

在最坏的情况下,我期待轻微的错位,但不是完全错位.出了什么问题?

我没有将图像的方向传递到Vision框架中,但这不应该是对齐图像的问题.这仅仅是面部检测等问题,在这种情况下,旋转的面部不会被检测为面部.在任何情况下,输出图像都具有正确的方向,因此方向不是问题.

我的合成代码工作正常.这只是Vision框架的一个问题.如果我删除了对Vision框架的调用,放上三脚架的手机,组合就能完美运行.没有错位.所以问题是Vision框架.

这是在iPhone X上.

如何让Vision框架正常工作?我可以告诉它使用陀螺仪,加速度计和罗盘数据来改善对齐吗?

image-processing computer-vision cgaffinetransform ios sequence-alignment

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

为什么VideoDataOutput的availableVideoCodecTypes为空?

AVCaptureVideoDataOutput有一个字段availableVideoCodecTypes,它应该告诉你可以用来录制视频的编解码器,但它总是空的.为什么是这样?

我在创建VideoDataOutput后立即检查了它的值,并在将其添加到会话后,但它是空的.我尝试使用运行iOS 10的iPhone 5s和运行iOS 11的iPhone 7 Plus,两者都是空的.

这个问题是关于AVCaptureVideoDataOutput.AVCaptureMovieFileOutput有另一个具有相同名称的字段,但是问题与此无关.

可以说VideoDataOutput为您提供帧而不是记录到文件,因此不涉及编解码器,这就是属性为零的原因,但在这种情况下,为什么要拥有该属性?

iphone codec ios avcapture

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

我应该为 CIImage 还是 CIContext 设置颜色空间?

Core Image 让我们为 CIContext 指定颜色空间,如下所示:

let context = CIContext(options: [kCIContextOutputColorSpace: NSNull(),
                        kCIContextWorkingColorSpace: NSNull()])
Run Code Online (Sandbox Code Playgroud)

或者对于 CIImage,如下所示:

let image = CIImage(cvImageBuffer: inputPixelBuffer,
                    options: [kCIImageColorSpace: NSNull()])
Run Code Online (Sandbox Code Playgroud)

这三者有何关系:

  • kCIContextOutputColorSpace
  • kCIContext工作颜色空间
  • kCI图像颜色空间

设置它们各自的优点和缺点是什么?

core-image color-space cgcolorspace ciimage

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

如何在Objective C中实现类别?

我知道如何使用类别作为程序员,但我很好奇它们是如何实现的.编译器是否将它们编译为从静态初始化程序调用class_replaceMethod?谢谢.

internals objective-c categories

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

如何干净地覆盖属性设置器?

如果我想定义一个自定义的UIView子类,它在设置边界时做了什么,我该如何覆盖setter?覆盖setBounds似乎很危险,因为如果我理解正确,getter和setter名称不是公共接口的一部分,并且可能随时更改.

当然,我用class_copyPropertyList查询运行时在类中定义的属性列表,然后查询它的setter的名字,最后用class_addMethod添加的方法,在第一次得到一个参考前面的方法使用调用原始版本.

这一切看起来都很糟糕.是否有一种干净的方式来做我想要的,保证在未来的操作系统版本上不会中断?谢谢.

iphone cocoa cocoa-touch uikit ios

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

为什么我的面部检测代码不能使用CIDetector正常工作?

我正在尝试在我的iOS相机应用程序中检测面部,但它无法正常工作,而它在Camera.app中正常工作.请注意:

  • 我的应用中没有检测到第一张脸,只在Camera.app中检测到.
  • 对于第三张脸 - 东亚女人 - Camera.app正确地在她的脸上画一个矩形,而我的应用程序绘制一个远远低于她脸的矩形.
  • 我的应用程序中未检测到奥巴马的脸,仅在Camera.app中检测到.
  • 当相机从普京的脸部缩小时,我的应用程序在他的右半边画一个矩形,将其切成两半,而Camera.app正确地在他的脸上画一个矩形.

为什么会这样?

我的代码如下.你觉得有什么不对吗?

首先,我创建一个视频输出如下:

let videoOutput = AVCaptureVideoDataOutput()
videoOutput.videoSettings =
    [kCVPixelBufferPixelFormatTypeKey as AnyHashable: 
    Int(kCMPixelFormat_32BGRA)]

session.addOutput(videoOutput)

videoOutput.setSampleBufferDelegate(faceDetector, queue: faceDetectionQueue)
Run Code Online (Sandbox Code Playgroud)

这是代表:

class FaceDetector: NSObject, AVCaptureVideoDataOutputSampleBufferDelegate {
  func captureOutput(_ captureOutput: AVCaptureOutput!,
                     didOutputSampleBuffer sampleBuffer: CMSampleBuffer!,
                     from connection: AVCaptureConnection!) {
    let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
    let features = FaceDetector.ciDetector.features(
        in: CIImage(cvPixelBuffer: imageBuffer))

    let faces = features.map { $0.bounds }
    let imageSize = CVImageBufferGetDisplaySize(imageBuffer)

    let faceBounds = faces.map { (face: CIFeature) -> CGRect in
        var …
Run Code Online (Sandbox Code Playgroud)

camera avfoundation ios avcapture cidetector

6
推荐指数
0
解决办法
434
查看次数