我有一个带有项目列表的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)
干杯,道格
我在一个项目中广泛使用了shared_ptr和STL,这导致了过长的,容易出错的类型shared_ptr< vector< shared_ptr<const Foo> > >(我喜欢ObjC程序员,长名称是常态,但这仍然太过分了.)我相信,更加清楚的是,一致地调用它FooListPtr并记录命名约定,"Ptr"表示shared_ptr,"List"表示shared_ptr的向量.
这很容易输入typedef,但它会导致头文件出现问题.我似乎有几个选项可以定义FooListPtr:
这里有最好的做法吗?当可重用性,可读性和一致性至关重要时,它们如何在实际代码中生效?
如果其他人想要添加其他选项供讨论,我已经标记了这个社区维基.
我正在寻找工具和方法来确定我的Cocoa和Cocoa-Touch程序的哪些部分最有助于最终的二进制图像大小,以及帮助减少它的方法.我不是在寻找一个"魔术子弹"编译器标志.我正在寻找用于评估和减少图像尺寸浪费的剖析技术,与Shark和Instruments帮助进行运行时评估相同.
一阶近似可能是.o的大小,但在优化和死代码剥离后的最终图像大小方面,这是多么值得信赖?如果我将所有的.o加起来,它们比我的最终图像大得多,所以链接器显然已经帮我了很多.但这意味着.o的大小可能不是一个有用的衡量标准.
在不破坏代码可维护性的情况下,其他人会在哪些方面减少图像大小?
我有一个导入到 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) MobileSafari通常具有不正确的HTML按钮行为(不正确的含义:"不像iOS本机按钮").正确的按钮行为如下:
MobileSafari按钮在您触摸时突出显示,无论您在何处移动都会保持突出显示,无论您在何处释放它们都会点击(除非视图滚动,在这种情况下,即使您重新进入按钮,触摸也始终被取消).
此问题适用于所有可点击的内容,例如链接(-webkit-touch-callout设置为时none).到目前为止,我只发现了一个具有正确按钮行为的Web应用程序:Facebook.看看他们的代码,看起来他们已经完成了很多跳跃式操作以使其正常工作(手动跟踪所有鼠标事件而根本不使用按钮).代码密集,使用Javelin,我还不清楚使其工作所需的所有部分.
我知道我有点开玩笑(因为如果这很容易,每个人都会这样做),但无论如何我都会问.是否有任何通用的代码可以处理此功能?有没有比逆向工程Javelin更简单的解决方案,即使它只适用于WebKit?(Javelin不太适合我的轻量级需求.)我的最终目标是UIWebView在本机应用程序中嵌入正确的按钮行为,因此混合JavaScript/ObjC解决方案也是可以接受的(虽然没有想到混合方法).
我有几十个文本,我想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) 我从地址簿文档中了解到我对底层CoreData实现的理解表明,通讯簿应该是线程安全的,并且从多个线程进行查询应该没有问题.但是我很难在文档中找到任何关于线程安全的明确讨论.这引出了一些问题:
我需要针对AddressBook进行几十个查询(一些复杂的),并且我正在使用NSOperation在后台线程上执行此操作以避免阻止UI(它当前正在执行).我的基本问题是,将最大并发操作设置为大于1的值是否有意义,以及如果应用程序也可能同时在另一个线程上写入AddressBook,是否存在任何危险.
我正在以编程方式生成音频文件,我想向其中添加元数据,例如标题和艺术家.我并不特别关心文件的格式是什么,只要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).
在此背景下,我的核心问题是:
我稍后会探索第三方id3框架,但如果可能的话,我想用AVFoundation(或其他内置框架)来实现它.
cocoa ×2
ios ×2
objective-c ×2
addressbook ×1
avfoundation ×1
avrcp ×1
c++ ×1
cocoa-touch ×1
css ×1
id3 ×1
javascript ×1
linux ×1
optimization ×1
safari ×1
swift ×1
swiftui ×1
typedef ×1
uiview ×1
unix ×1
urlrequest ×1
webkit ×1