小编Jaa*_*nus的帖子

如何在 SwiftUI 列表中以正确的高度渲染多行文本?

我想要一个显示多行文本的 SwiftUI 视图,具有以下要求:

  • 适用于 macOS 和 iOS。
  • 显示大量字符串(每个字符串由一个单独的模型对象支持)。
  • 我可以对多行​​文本进行任意样式设置。
  • 每个文本字符串可以是任意长度,可能跨越多个行和段落。
  • 每个文本字符串的最大宽度固定为容器的宽度。高度根据文本的实际长度而变化。
  • 没有滚动每个单独的文本,只有列表。
  • 文本中的链接必须是可点击/可点击的。
  • 文本是只读的,不必是可编辑的。

感觉最合适的解决方案是拥有一个列表视图,包装原生 UITextView/NSTextView。

这是我到目前为止所拥有的。它实现了大多数要求,除了具有正确的行高度。

//
//  ListWithNativeTexts.swift
//  SUIToy
//
//  Created by Jaanus Kase on 03.05.2020.
//  Copyright © 2020 Jaanus Kase. All rights reserved.
//

import SwiftUI

let number = 20

struct ListWithNativeTexts: View {
    var body: some View {
        List(texts(count: number), id: \.self) { text in
            NativeTextView(string: text)
        }
    }
}

struct ListWithNativeTexts_Previews: PreviewProvider {
    static var previews: some View {
        ListWithNativeTexts()
    }
} …
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-list uiviewrepresentable nsviewrepresentable

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

如何在YUI3中获得计算的元素宽度和高度?

jQuery有方便的.height()和.width()实用程序来计算DOM元素的显示大小.它还有.position()来获取坐标.在YUI3 Node中,我看到有.getX(),. getY()和.getXY()实用程序来获取位置,但我没有看到任何大小(或看不到).

在YUI3中获取元素高度和宽度的好方法是什么?

jquery yui dom

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

如何在不杀死电池的情况下监控MPMoviePlayerController播放进度?

我有一个使用MPMoviePlayerController播放音乐的媒体播放器应用.我需要根据播放位置更新UI.我能说的最好,没有办法通过回调或其他东西主动接收来自玩家的信息,我基本上需要自己进行轮询.

所以我想我会使用一个简单的计时器,每秒运行一次.代码是这样的:

在设置代码中的某处:

[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updatePlaybackProgressFromTimer:) userInfo:nil repeats:YES];
Run Code Online (Sandbox Code Playgroud)

然后:

- (void) updatePlaybackProgressFromTimer:(NSTimer *)timer {

    if (([UIApplication sharedApplication].applicationState == UIApplicationStateActive) && (player.playbackState == MPMoviePlaybackStatePlaying)) {

        CGFloat progress = player.currentPlaybackTime / player.duration;
        // do something useful with this info            
    }
Run Code Online (Sandbox Code Playgroud)

}

即使应用程序在后台,计时器也会每秒运行一次.该方法首先查看应用是否处于活动状态且播放器正在播放,然后进行一些UI更新.

以这种方式每秒运行计时器是否有电池寿命的影响?我是否应该更勤奋并尝试在进入后台时拆除计时器并在激活应用程序时重新激活它?我确定有一些电池寿命效应,但实际上,它有多严重?或者还有其他推荐的方法来做这种事吗?

cocoa-touch mpmovieplayercontroller nstimer ios

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

如何根据相关对象集合的属性对Core Data结果进行排序?

设置:我有一个父对象的集合,称之为ObjectA.每个ObjectA与ObjectB具有一对多的关系.因此,一个ObjectA可能包含0..n ObjectB-s,并且每个ObjectB都有一个特定的ObjectA作为其父对象.

现在,我想对ObjectA-s进行Core Data提取,它们按照最新的ObjectB进行排序.是否可以为此创建排序描述符?

有一个相关的问题描述了完全相同的情况.答案建议将ObjectB中的属性非规范化为ObjectA.如果用一个获取请求确实无法做到这一点,那就没问题.

相关问题还提到:

实际上,我只是有个主意!也许我可以通过消息对对话进行排序.@ max.sortedDate ...

我试过了.这似乎不可能.我收到此错误:

2012-10-05 17:51:42.813 xxx[6398:c07] *** Terminating app due to uncaught
exception 'NSInvalidArgumentException', reason: 'Keypath containing
KVC aggregate where there shouldn't be one; failed to handle
ObjectB.@max.creationTime'
Run Code Online (Sandbox Code Playgroud)

将属性反规范化为ObjectA是唯一/最佳解决方案吗?

core-data nssortdescriptor

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

viewDidAppear:在某些条件下不开火?

我的app nib中有以下项目:

  • 通常:文件的所有者,第一响应者窗口,委托
  • 查看控制器"a"
    • 查看"b"
      • UIScrollView"c"
      • "b"中的其他一些东西

在我的AppDelegate applicationDidFinishLaunching中,我这样做:

  1. [window makeKeyAndVisible]
  2. [window addSubView:a.view];
  3. 创建一个视图控制器"d"
  4. 用rootviewcontroller"d"创建一个navigationController"e"
  5. 调用[c addSubView:e.view]

问题/问题:当我执行以上所有操作时,viewDidAppear:不会触发"d".(但是viewDidLoad正在开火.)我怎样才能找出它为什么没有射击,并修复它以便射击?

(为什么我要使用viewDidAppear:上面涉及一些链式动画,viewDidAppear看起来像一个视图控制器知道何时加载和动画视图的好地方,因此它可以触发后续动画.)

iphone cocoa-touch uiviewcontroller

5
推荐指数
1
解决办法
3904
查看次数

核心数据模式:如何通过网络变化有效地更新本地信息?

我的应用程序效率低下,我想了解并修复.

我的算法是:

fetch object collection from network
for each object:
  if (corresponding locally stored object not found): -- A
    create object
    if (a nested related object locally not found): -- B
      create a related object
Run Code Online (Sandbox Code Playgroud)

我正在通过使用相关对象的键创建谓词查询来检查A行和B行,该键是我的模式的一部分.我看到A(总是)和B(如果执行分支到该部分)生成一个SQL选择,如:

2010-02-05 01:57:51.092 app[393:207] CoreData: sql: SELECT <a bunch of fields> FROM ZTABLE1 t0 WHERE  t0.ZID = ? 
2010-02-05 01:57:51.097 app[393:207] CoreData: annotation: sql connection fetch time: 0.0046s
2010-02-05 01:57:51.100 app[393:207] CoreData: annotation: total fetch execution time: 0.0074s for 0 rows.
2010-02-05 01:57:51.125 app[393:207] CoreData: …
Run Code Online (Sandbox Code Playgroud)

iphone performance core-data nsfetchrequest cocoa-design-patterns

5
推荐指数
1
解决办法
5249
查看次数

如何在父视图部分剪切的子视图上触发UITapGestureRecognizer?

设置:我有父视图A.它有一个子视图B. B部分位于A的边界内,但部分位于外部(A有clipsToBounds = false).我已将UITapGestureRecognizer(UITGR)附加到B.

观察:当我点击B区域内的B部分时,UITGR会激活.当我点击超出A界限的B部分时,UITGR不会触发.

预期/问题:当我点击超出A界限的B部分时,如何使UITGR激发?

cocoa-touch uiview uigesturerecognizer

5
推荐指数
1
解决办法
1607
查看次数

如何让我的Cocoa应用程序精确绘制我的设计师在Sketch中指定的颜色?

我的设计师指定了要绘制的颜色.当我尝试在Cocoa应用程序中绘制该颜色时,我得到的结果颜色与Sketch.app显示的参考图像明显不同.

我制作了一个小型Cocoa应用程序,可以绘制自定义视图.这是代码中有趣的部分.请注意,我正在初始化SRGB空间中的颜色.

class View: NSView {
    override func drawRect(dirtyRect: NSRect) {
        let components : [CGFloat] = [156.0/255.0, 0, 254.0/255.0, 1]
        let color = NSColor.init(SRGBRed: components[0], green: components[1], blue: components[2], alpha: components[3])
        color.setFill()
        NSRectFill(self.bounds)
    }    
}
Run Code Online (Sandbox Code Playgroud)

这是它绘制的内容.(没关系光标的部分.我删除了窗口阴影,这样就可以更容易地与其他窗口并排查看.)

在此输入图像描述

这是Sketch文件部分:

在此输入图像描述

将它们放在一起,这里是Sketch文件和自定义视图的并排,以及显示鼠标光标下的颜色值的Xscope放大镜.

将鼠标悬停在Sketch文件上时,我看到:

在此输入图像描述

将鼠标悬停在我的自定义视图上时,我会看到:

在此输入图像描述

您可以看到Xscope读取的黑色鼠标光标下的像素颜色值明显不同.我的Retina Macbook Pro显示器的颜色也有很大不同,但有趣的是,在捕获的屏幕截图PNG中没有那么不同.

但是:到目前为止,这一切都是通过默认显示设置和颜色配置文件"Color LCD"完成的(硬件是Retina Macbook Pro及其内置显示屏).当我在OSX设置应用程序中手动将显示配置文件更改为"sRGB IEC61966-2.1",然后使用Xscope再次采样颜色时,您可以看到这些采样值:

在此输入图像描述

在对自定义视图进行采样时:

在此输入图像描述

最有趣的是,您可以看到Xscope在我的自定义视图上采样的值与指定的值完全匹配,并且颜色在视觉上也是正确的.但是,当然,我不能让我的用户更改他们的显示配置文件.

我的问题:如何使我的自定义视图颜色与Sketch中的颜色(用于目视检查和使用Xscope放大镜采样时)与默认的彩色LCD显示配置文件完全匹配?

cocoa appkit nscolorspace

5
推荐指数
1
解决办法
670
查看次数

为什么C不运行unsigned int与负值的比较?

考虑这个C代码:

#include "stdio.h"

int main(void) {

    int count = 5;
    unsigned int i;

    for (i = count; i > -1; i--) {
        printf("%d\n", i);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的观察/问题:循环永远不会被执行.但是,如果我将i的数据类型从unsigned int更改为int,则一切都按预期工作.

我一直在考虑使用无符号整数作为当你试图从它们中减去时"环绕"的值.因此,当i为零并且我减去1时,它将回绕到UINT_MAX.而且由于它的价值永远不会消极,这实际上是一个无限循环.(当我将比较从i> -1更改为i> = 0时,这正是发生的情况.)

在我的逻辑中某处有一个错误,因为如果我是无符号的,循环永远不会执行,我将它与-1进行比较.编译器要么以某种方式优化它,要么运行时值的行为与我期望的不同.

为什么循环不能运行?

c optimization unsigned-integer

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

如果对象属性发生变化,如何重新加载一行 SwiftUI 核心数据支持的列表?

我有一个标准的 SwiftUI 列表设置,由 Core Data FetchRequest 提供支持。

struct SomeView: View {

    var container: Container
    var myObjects: FetchRequest<MyObject>

    init(container: Container) {
        let predicate : NSPredicate = NSPredicate(format: "container = %@", container)
        self.container = container
        self.myObjects = FetchRequest<MyObject>(entity: MyObject.entity(), sortDescriptors: [NSSortDescriptor(key: "date", ascending: true)], predicate: predicate)
    }

    var body: some View {
        VStack(spacing: 0.0) {
            List(myObjects.wrappedValue, id: \.uniqueIdentifier) { myObject in
                rowView(for: myObject, from: self.myObjects.wrappedValue)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

添加和删​​除项目时一切正常。RowView 返回一个视图,该视图根据 myObject 的各种属性呈现不同的内容。

问题:当我修改应用程序中其他地方的特定 myObject(更改其属性之一)并保存关联的 Core Data ManagedObjectContext 时,表示该项目的 List 行不会在 UI …

core-data swiftui swiftui-list

3
推荐指数
1
解决办法
1067
查看次数