小编Mis*_*cha的帖子

集合视图混淆了iOS 9下的最小行距和最小项目间距

我只是遇到了一个关于a的行为的非常奇怪的问题UICollectionView,我认为集合视图和我都非常困惑。

我在项目中实现了一个具有水平滚动方向的特定收集视图,不久之后,质量保证发布了一个错误通知,指出在某些设备上收集视图项之间的间距不正确。我进一步检查了该错误,并意识到问题不仅在特定设备上仍然存在,而且在运行iOS 9的所有设备上仍然存在。在iOS 10上,一切正常。

因此,我创建了一个简单的示例项目来隔离可以在GitHub上找到的潜在问题:

显示问题的交互式样本项目

首先,我对示例项目没有显示iOS 9错误感到更加困惑。但是,一旦我将其设置为estimatedItemSize非零值以使用自动调整大小的单元格(即“自动布局”),就会再次出现相同的不正确间距。

我发现只有在以下特定情况下(iOS 9 +estimatedItemSize != .zero),集合视图才会使minimumLineSpacing混淆minimumInteritemSpacing,至少在实现各自的流布局委托函数时:

collectionView(_:layout:minimumLineSpacingForSectionAt:) collectionView(_:layout:minimumInteritemSpacingForSectionAt:)

因此,无论何时要指定这些间距之一,都必须实现另一个间距。

对我来说,这似乎是一个严重的系统错误,但这是一件大事,我无法相信没有其他人会遇到此问题。因此,更有可能在代码中或在理解这些间距的工作方式时犯了一些错误(尽管在Apple Docs中已经很清楚地描述了上面链接的委托方法)。

为什么集合视图会将这两个维度混合在一起?

EstimatedItemSize == .zero EstimatedItemSize!= .zero

示例项目中的“使用自动布局”开关在(禁用)和(启用)estimatedItemSize之间切换。.zeroCGSize(width: 100, height: 50)

ios uicollectionview uicollectionviewlayout swift

5
推荐指数
0
解决办法
748
查看次数

获取对当前可见视图控制器的引用

我有一个UIAlertView.当用户点击警报视图中的按钮时,我想显示一个新按钮UIViewController.

为了实现这一点,我需要知道哪个视图控制器当前在屏幕上可见,因为该特定视图控制器是呈现新视图控制器的正确视图控制器.

问题是我的应用程序中有一个复杂的视图控制器层次结构,包括a UINavigationController和a UITabBarController(以及其他).所以我不能简单地self.visibleViewController用来获取当前可见的视图控制器.

我已经在Stackoverflow上找到了一个可能的解决方案,但我想找到一个更简洁的解决方案而无需挖掘整个视图控制器堆栈.

uiviewcontroller ios

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

如何在jstl中删除会话变量

我想删除会话变量或在JSTL中将其设置为null。请帮我。如果我尝试使用

<c:set var="varialbleName" value=null scope="session" /> 
Run Code Online (Sandbox Code Playgroud)

但这给了我以下服务器错误

Server Error
Caused by:

org.apache.jasper.JasperException: /WEB-INF/jsps/forum.jsp (line: 78, column: 71) quote symbol expected
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:276)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:92)
at org.apache.jasper.compiler.Parser.parseAttribute(Parser.java:223)
at org.apache.jasper.compiler.Parser.parseAttributes(Parser.java:163)
at org.apache.jasper.compiler.Parser.parseAttributes(Parser.java:154)
at org.apache.jasper.compiler.Parser.parseCustomTag(Parser.java:1231)
at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1453)
at org.apache.jasper.compiler.Parser.parseBody(Parser.java:1666)
at org.apache.jasper.compiler.Parser.parseOptionalBody(Parser.java:996)
at org.apache.jasper.compiler.Parser.parseCustomTag(Parser.java:1271)
at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1453)
at org.apache.jasper.compiler.Parser.parse(Parser.java:139)
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:227)
at org.apache.jasper.compiler.ParserController.parse(ParserController.java:100)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:199)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:356)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:336)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:323)
Run Code Online (Sandbox Code Playgroud)

jsp jstl

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

如何使NSAttributedString可编码兼容?

问题是什么?

目前,我正在通过JSON进行通讯的主应用程序上构建应用程序扩展。主题和数据位于JSON中,并通过Apple的可编码协议进行解析。我现在遇到的问题是使NSAttributedString可编码兼容。我知道它不是内置的,但我知道它可以转换为数据并返回到

我到目前为止有什么?

将NSAttributedString强制转换为数据以便通过JSON共享。

if let attributedText = something.attributedText {
    do {
        let htmlData = try attributedText.data(from: NSRange(location: 0, length: attributedText.length), documentAttributes: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType])
        let htmlString = String(data: htmlData, encoding: .utf8) ?? "" 
    } catch {
        print(error)
    }
}
Run Code Online (Sandbox Code Playgroud)

将html JSON字符串转换回NSAttributedString:

do {
    return try NSAttributedString(data: self, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
} catch {
    print("error:", error)
    return  nil
}
Run Code Online (Sandbox Code Playgroud)

我的问题?

如何制作一个具有nsAttributedTitle属性的结构,该属性的类型为NSAttributedString,并使其与自定义编码器解码器兼容?

结构示例(无需考虑可编码合规性):

struct attributedTitle: Codable {
    var title: NSAttributedString

    enum CodingKeys: String, CodingKey {
        case …
Run Code Online (Sandbox Code Playgroud)

swift codable

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

为什么许多音频播放器将我的单声道 AAC (m4a) 文件解释为立体声?

mono在我的iPhone应用程序中,我使用AAC(m4a容器)录制音频文件AVAudioRecorder,即我明确设置

[recordSettings setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey];
Run Code Online (Sandbox Code Playgroud)

当在Audacity等音频编辑器中打开这些文件时,它们仅按预期显示一个通道。但是,有许多流行的音频播放器(例如VLCfoobar2000)将文件解释为stereo. 例如,当我Media Information... > Codec Details在 VLC 中显示时,它看起来像这样:

屏幕截图 VLC

有趣的是,用iPhone 上的Apple语音备忘录应用程序录制的文件也显示出相同的行为。它们似乎是stereo多个音频播放器中的文件,但当我在 Audacity 中打开它们时,发现它们只有一个通道。

我不敢相信所有那些知名的媒体播放器都有缺陷。那么有没有什么方法可以告诉您AVAudioRecorder以某种方式设置频道编号,以便所有主要媒体播放器都可以正确检测到它?

aac m4a channel avaudiorecorder ios

2
推荐指数
1
解决办法
1411
查看次数

如何将多个视图连接到swift中的单个标签栏项?

我有一个标签栏控制器,它有两个项目连接到两个视图控制器(比如A和B)现在我想添加一个第三视图控制器(比如说C).但我不想在标签视图中添加第三个图标.当用户选择第二个图标时,它应该呈现B或C,具体取决于用户是否已登录.

故事板设置

ios tabview swift

2
推荐指数
1
解决办法
2838
查看次数

如何在 LazyVGrid 中以编程方式触发 NavigationLink

我有一个LazyVGrid里面的NavigationView

NavigationView {
    ScrollView {
        LazyVGrid(columns: columns) {
            ForEach(items) { item in
                NavigationLink(tag: item, selection: $displayedItem) {
                    DetailView(item)
                } label: {
                    GridItemView(item)
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

引用的变量在视图上定义如下:

@State var displayedItem: Item?
let columns: [GridItem] = Array(repeating: .init(.flexible()), count: 2)
Run Code Online (Sandbox Code Playgroud)

现在我想显示特定项目的详细视图。我通过简单地将此项分配给displayedItem属性来做到这一点:

func showDetailView(for item: Item) {
    displayedItem = item
}
Run Code Online (Sandbox Code Playgroud)

LazyVGrid当我调用此函数时相应项目可见时,这非常有效。但是,当该项目不可见时,我首先需要滚动到该项目才能NavigationLink触发。我知道为什么会发生这种情况(因为项目是延迟加载的,毕竟它是一个惰性LazyVGrid网格),但我不知道如何在需要时加载特定项目。


我尝试过的:

我还尝试通过将整个内容包装ScrollView在 a 内ScrollViewReader并附加以下修饰符以编程方式滚动到目标项目:

.onChange(of: displayedItem) { item in
    if let item = …
Run Code Online (Sandbox Code Playgroud)

lazy-loading swiftui swiftui-navigationlink lazyvgrid

2
推荐指数
1
解决办法
1306
查看次数

在 SwiftUI 中同时对按钮的文本和位置进行动画处理

我有一个非常简单的视图,仅显示 a Text、 aShape和 aButton垂直堆叠在 a 中ScrollView。是Shapea且仅当是Capsule时才会有条件地显示。showCapsuletrue

\n
struct ContentView: View {\n\n    @State var showCapsule = true\n\n    var body: some View {\n        ScrollView {\n            VStack(spacing: 16) {\n                Text("Why, oh why? ")\n                    .font(.headline)\n                if showCapsule {\n                    Capsule()\n                        .frame(maxWidth: .infinity)\n                        .frame(height: 100)\n                        .foregroundColor(.blue)\n                }\n                Button {\n                    showCapsule.toggle()\n                } label: {\n                    Text(showCapsule ? "Hide" : "Show")\n                }\n                .buttonStyle(.bordered)\n            }\n            .frame(maxWidth: .infinity)\n            .padding()\n        }\n        .animation(.default, value: showCapsule)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

观察到的和预期的动画

\n …

animation button swiftui swiftui-animation

2
推荐指数
1
解决办法
619
查看次数