小编Rob*_*ier的帖子

迫使UIView重绘的最强大的方法是什么?

我有一个带有项目列表的UITableView.选择一个项目会推送一个viewController,然后继续执行以下操作.从方法viewDidLoad我为我的子视图所需的数据启动了一个URLRequest - 一个覆盖了drawRect的UIView子类.当数据从云端到达时,我开始构建我的视图层次结构.有问题的子类传递数据,它的drawRect方法现在具有渲染所需的一切.

但.

因为我没有显式调用drawRect - Cocoa-Touch处理 - 我无法通知Cocoa-Touch我真的非常希望这个UIView子类呈现.什么时候?现在会好的!

我试过[myView setNeedsDisplay].有时这种方式有效.非常参差不齐.

我已经和它搏斗了好几个小时.有人请求我提供坚如磐石,保证强制UIView重新渲染的方法.

以下是将数据提供给视图的代码片段:

// Create the subview
self.chromosomeBlockView = [[[ChromosomeBlockView alloc] initWithFrame:frame] autorelease];

// Set some properties
self.chromosomeBlockView.sequenceString     = self.sequenceString;
self.chromosomeBlockView.nucleotideBases    = self.nucleotideLettersDictionary;

// Insert the view in the view hierarchy
[self.containerView          addSubview:self.chromosomeBlockView];
[self.containerView bringSubviewToFront:self.chromosomeBlockView];

// A vain attempt to convince Cocoa-Touch that this view is worthy of being displayed ;-)
[self.chromosomeBlockView setNeedsDisplay];
Run Code Online (Sandbox Code Playgroud)

干杯,道格

cocoa-touch urlrequest uiview

112
推荐指数
4
解决办法
13万
查看次数

typedef的头文件最佳实践

我在一个项目中广泛使用了shared_ptr和STL,这导致了过长的,容易出错的类型shared_ptr< vector< shared_ptr<const Foo> > >(我喜欢ObjC程序员,长名称是常态,但这仍然太过分了.)我相信,更加清楚的是,一致地调用它FooListPtr并记录命名约定,"Ptr"表示shared_ptr,"List"表示shared_ptr的向量.

这很容易输入typedef,但它会导致头文件出现问题.我似乎有几个选项可以定义FooListPtr:

  • Foo.h. 这会缠绕所有标题并造成严重的构建问题,因此它不是首发.
  • FooFwd.h("前向标题").这就是Effective C++建议的,基于iosfwd.h.它非常一致,但保持两倍标题的开销似乎很烦人.
  • Common.h(将所有这些放在一个文件中).这通过缠绕许多不相关的类型来杀死可重用性.您现在不能只拿起一个对象并将其移动到另一个项目.这不是首发.
  • 某种类似幻想的#define魔法,如果它还没有被typedefed,那就是typedef.我对预处理器持续不喜欢,因为我认为它让新人很难理解代码,但也许......
  • 使用向量子类而不是typedef.这似乎很危险......

这里有最好的做法吗?当可重用性,可读性和一致性至关重要时,它们如何在实际代码中生效?

如果其他人想要添加其他选项供讨论,我已经标记了这个社区维基.

c++ typedef

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

分析Objective-C二进制图像大小

我正在寻找工具和方法来确定我的Cocoa和Cocoa-Touch程序的哪些部分最有助于最终的二进制图像大小,以及帮助减少它的方法.我不是在寻找一个"魔术子弹"编译器标志.我正在寻找用于评估和减少图像尺寸浪费的剖析技术,与Shark和Instruments帮助进行运行时评估相同.

一阶近似可能是.o的大小,但在优化和死代码剥离后的最终图像大小方面,这是多么值得信赖?如果我将所有的.o加起来,它们比我的最终图像大得多,所以链接器显然已经帮我了很多.但这意味着.o的大小可能不是一个有用的衡量标准.

在不破坏代码可维护性的情况下,其他人会在哪些方面减少图像大小?

optimization cocoa objective-c

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

使用 Swift Package Manager 生成 Objective-C 头文件

我有一个导入到 ObjC 代码中的现有 Swift 框架。我想将它从 xcodeproj 移动到 Swift Package Manager。到目前为止,我还没有找到生成 ObjC 标头并导入它的方法。

例如,考虑以下最小项目:

$ ls -R
Package.swift Sources

./Sources:
SwiftStuff objc

./Sources/SwiftStuff:
SwiftStuff.swift

./Sources/objc:
main.m
Run Code Online (Sandbox Code Playgroud)

包.swift

// swift-tools-version:5.1
import PackageDescription

let package = Package(
    name: "ObjCStuff",
    products: [
        .executable(name: "objc", targets: ["objc"]),
        .library(name: "SwiftStuff", targets: ["SwiftStuff"]),
    ],
    targets: [
        .target(name: "SwiftStuff"),
        .target(name: "objc", dependencies: ["SwiftStuff"]])
    ]
)
Run Code Online (Sandbox Code Playgroud)

SwiftStuff.swift

import Foundation

@objc public class TheObject: NSObject {
    @objc public func dothing() {
        print("DO IT!")
    }
}
Run Code Online (Sandbox Code Playgroud)

主文件

#import <Foundation/Foundation.h>
@import SwiftStuff; …
Run Code Online (Sandbox Code Playgroud)

objective-c swift swift-package-manager

12
推荐指数
0
解决办法
1084
查看次数

添加更多倾斜到斜体文本

我很好奇你是否可以使用CSS更倾向于影响斜体文本?如果是这样,怎么办呢?

css

11
推荐指数
3
解决办法
9464
查看次数

适用于MobileSafari的正确触摸按钮行为

MobileSafari通常具有不正确的HTML按钮行为(不正确的含义:"不像iOS本机按钮").正确的按钮行为如下:

  • 用户触摸按钮:按钮高亮显示
  • 用户将手指拖出按钮:按钮变暗
  • 用户将手指拖回按钮:按钮高亮显示
  • 用户将手指拖出按钮并释放:按钮未单击

MobileSafari按钮在您触摸时突出显示,无论您在何处移动都会保持突出显示,无论您在何处释放它们都会点击(除非视图滚动,在这种情况下,即使您重新进入按钮,触摸也始终被取消).

此问题适用于所有可点击的内容,例如链接(-webkit-touch-callout设置为时none).到目前为止,我只发现了一个具有正确按钮行为的Web应用程序:Facebook.看看他们的代码,看起来他们已经完成了很多跳跃式操作以使其正常工作(手动跟踪所有鼠标事件而根本不使用按钮).代码密集,使用Javelin,我还不清楚使其工作所需的所有部分.

我知道我有点开玩笑(因为如果这很容易,每个人都会这样做),但无论如何我都会问.是否有任何通用的代码可以处理此功能?有没有比逆向工程Javelin更简单的解决方案,即使它只适用于WebKit?(Javelin不太适合我的轻量级需求.)我的最终目标是UIWebView在本机应用程序中嵌入正确的按钮行为,因此混合JavaScript/ObjC解决方案也是可以接受的(虽然没有想到混合方法).

javascript safari webkit mobile-safari ios

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

使用锚点定位视图

我有几十个文本,我想lastTextBaseline放置它们的前导基线 ( ) 位于特定坐标处。position只能设置中心。例如:

import SwiftUI
import PlaygroundSupport
struct Location: Identifiable {
    let id = UUID()
    let point: CGPoint
    let angle: Double
    let string: String
}

let locations = [
    Location(point: CGPoint(x: 54.48386479999999, y: 296.4645408), angle: -0.6605166885682314, string: "Y"),
    Location(point: CGPoint(x: 74.99159120000002, y: 281.6336352), angle: -0.589411952788817, string: "o"),
]

struct ContentView: View {
    var body: some View {
        ZStack {
            ForEach(locations) { run in
                Text(verbatim: run.string)
                    .font(.system(size: 48))
                    .border(Color.green)
                    .rotationEffect(.radians(run.angle))
                    .position(run.point)

                Circle()  // Added to show …
Run Code Online (Sandbox Code Playgroud)

swiftui

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

地址簿线程的安全性和性能

我从地址簿文档中了解到我对底层CoreData实现的理解表明,通讯簿应该是线程安全的,并且从多个线程进行查询应该没有问题.但是我很难在文档中找到任何关于线程安全的明确讨论.这引出了一些问题:

  • 在多个线程上使用+ sharedAddressBook进行只读访问是否安全?我相信答案是肯定的.
  • 对于后台线程的写访问,似乎您应该使用+ addressBook(并手动保存更改).我能正确理解吗?
  • 是否有人调查过在多个线程上对地址簿进行多个同时查询的性能影响?这应该与在多个线程上进行多个CoreData查询的性能非常相似.我的感觉是,通过进行并行查询我几乎没有收获,因为我认为他们会在命中SQLLite时进行序列化,但我不确定这里.

我需要针对AddressBook进行几十个查询(一些复杂的),并且我正在使用NSOperation在后台线程上执行此操作以避免阻止UI(它当前正在执行).我的基本问题是,将最大并发操作设置为大于1的值是否有意义,以及如果应用程序也可能同时在另一个线程上写入AddressBook,是否存在任何危险.

cocoa addressbook

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

将元数据添加到生成的音频文件

我正在以编程方式生成音频文件,我想向其中添加元数据,例如标题和艺术家.我并不特别关心文件的格式是什么,只要AVPlayer读取它并将其发送到播放设备即可.(整个目标是将生成的音频及其曲目名称发送到蓝牙设备.我很高兴在iPhone上探索更简单的方法,无需编写文件或直接向文件添加元数据.)

到目前为止,我发现AVAssetWriter通常会抛弃它不理解的元数据,而不会产生错误,所以我有点磕磕绊绊地试图找到文件格式和键的组合是可以接受的.到目前为止,我还没有找到一个文件格式,我可以自动生成AVAssetWriter将添加任何元数据.例如:

let writer = try AVAssetWriter(outputURL: output, fileType: .aiff)  
let title = AVMutableMetadataItem()  
title.identifier = .commonIdentifierTitle  
title.dataType = kCMMetadataBaseDataType_UTF8 as String  
title.value = "The Title" as NSString  
writer.metadata = [title]  
// setup the input and write the file.  
Run Code Online (Sandbox Code Playgroud)

我没有找到任何标识符或文件类型(我实际上可以生成)的组合,它将在文件中包含此元数据.

我目前的方法是将文件创建为AIFF,然后使用AVAssetExportSession将其重写为m4a.使用它我已经能够添加足够的元数据,iTunes将显示标题.但是,Finder的"文件信息"无法读取标题(它对iTunes m4a文件的标题).我的假设是,如果它甚至没有显示在文件信息中,它将不会通过蓝牙发送(我将尽快测试,但我没有我需要的硬件).

研究iTunes m4a文件,我发现了一些我无法用AVMetadataItem重新创建的标签.例如,排序名称(sonm).我不知道如何编写不是已知标识符之一的标签(我已经测试了所有263个AVMetadataIdentifiers).

在此背景下,我的核心问题是:

  • AVPlayer读取哪些元数据标签并发送到蓝牙设备(即AVRCP)?
  • 是否可以直接将AVAssetWriter的元数据写入支持线性PCM(或其他一些易于生成的格式)的文件格式?
  • 如果已知的标记/值与任何AVMetadataIdentifiers都不匹配,是否可以在AVAssetExportSession中编写它?

我稍后会探索第三方id3框架,但如果可能的话,我想用AVFoundation(或其他内置框架)来实现它.

id3 avfoundation ios avrcp

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

linux中的jobs和ps命令有什么区别?

请告诉我unix操作系统中两个命令作业和ps显示的信息差异?

unix linux

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