小编Jor*_*n H的帖子

使用3D Touch Peek&Pop时,以模态方式呈现提交视图控制器而不是推送

我有一个应用程序,允许用户查看UICollectionViewController嵌入在其中的照片UINavigationController.当用户点击查看照片时,我会在全屏模式下呈现一个新的视图控制器(不是默认的全屏).我现在想要实现一个3D Touch提交(弹出)视图控制器,使其与用户点击照片时完全一样.问题是,当弹出全屏幕照片时,幕后的iOS会将此视图控制器推到堆栈上 - 导航栏仍然可见,它会添加一个后退按钮以返回上一个屏幕.我不希望这样,我希望提交视图控制器以模态方式呈现.

我注意到如果我删除导航控制器,iOS将以模态方式呈现提交视图控制器而不是推送.但我无法删除我的导航控制器,它仍然只是全屏显示而不是全屏.

如何更改默认行为,以便在原始视图控制器嵌入导航控制器内时,提交视图控制器以模式方式显示在全屏上而不是压入堆栈?

我试图设置modalPresentationStyle.OverFullScreen当我配置在提交的视图控制器previewingContext:commitViewController:.这似乎没有任何区别.

目前的行为是一个问题,原因有以下几点:
- 我出现在整个屏幕上,以便底层的视图控制器仍在下方可见,模糊不清.当它被推动时,这种效果无法实现.
- 我使用自定义过渡呈现全屏照片UIViewControllerTransitioningDelegate,并且它也会在关闭时转换.在推送后解除此操作时,它仅执行默认的弹出动画而不是我的自定义动画.

ios swift ios9 3dtouch

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

如何将图像附件添加到 AttributedString 中?

我正在努力替换NSAttributedStringAttributedString但未能成功使附件正常工作。尽管我应用了附件,但图像并未出现在字符串中。

let textAttachment = NSTextAttachment(image: UIImage(systemName: "exclamationmark.triangle.fill")!)
textAttachment.accessibilityLabel = "Warning"

// Original code
label.attributedText = NSAttributedString(attachment: textAttachment)

// New code
var attributedString = AttributedString()
attributedString.attachment = textAttachment
label.attributedText = NSAttributedString(attributedString)
Run Code Online (Sandbox Code Playgroud)

nsattributedstring ios swift ios15 attributedstring

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

如何在visionOS中自定义悬停效果区域

在13:00 左右的 WWDC 空间用户界面设计视频中,Apple 对于悬停效果做了以下说明:

当您设计锁定时,请包括一个形状,该形状将允许系统在人们关注它时显示悬停效果。在这里,我们有一些图像,下面有文字。每个锁定都是一个单独的交互元素。您需要定义一个自定义区域,以便它可以在人们观看时变亮。这有助于他们了解整个区域是一个可以选择的元素。并记住在每个包含的形状之间保留小空间。

它们包括来自音乐应用程序的示例:

音乐应用截图1 音乐应用截图2

我想在我的应用程序中执行此操作,在 LazyVGrid 中显示按钮,但无法实现该结果。我知道您需要使用plain按钮样式来隐藏边框按钮的背景但保持悬停效果。虽然悬停效果显示为椭圆形,但我希望它是一个圆角矩形,周围有额外的填充,悬停效果之间有 4 pt 的间距,如上所示。如何才能做到这一点?我以为.contentShape(.hoverEffect, .rect(cornerRadius: 50))会自定义该区域,但它似乎没有改变任何东西。

Button(action: tapAction) {
    VStack {
        Color.clear
            .background(.regularMaterial)
            .aspectRatio(1, contentMode: .fit)
            .clipShape(.rect(cornerRadius: 10))
            
        HStack(spacing: 0) {
            VStack(alignment: .leading, spacing: 0) {
                Text("Line one")
                
                Text("Line two")
                    .foregroundStyle(.secondary)
            }
            
            Spacer()
            
            MarkWateredButton(action: markWateredAction)
        }
    }
    .contentShape(.hoverEffect, .rect(cornerRadius: 50).inset(by: -10)) // FIXME: Doesn't do anything
}
.buttonStyle(.plain)
Run Code Online (Sandbox Code Playgroud)

我的应用程序的屏幕截图

hover swift visionos

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

在横向上为iPhone 6 Plus设置UIModalPresentationStyle?

我想在所有设备和所有方向上的弹出窗口中始终显示视图控制器.我试图通过采用UIPopoverPresentationControllerDelegate和设置sourceView和来完成这个sourceRect.故事板中的segue被配置为Present As Popover segue.这适用于所有设备和方向,除了横向的iPhone 6 Plus.在这种情况下,视图控制器在表单中从屏幕底部向上滑动.如何防止它始终出现在弹出框中?

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let popoverPresentationController = segue.destinationViewController.popoverPresentationController
    popoverPresentationController?.delegate = self
    popoverPresentationController?.sourceView = self.titleLabel!.superview
    popoverPresentationController?.sourceRect = self.titleLabel!.frame
}

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
    return UIModalPresentationStyle.None
}
Run Code Online (Sandbox Code Playgroud)

ios uipresentationcontroller

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

更新缓存的PFUser currentUser?

使用Parse登录时,[PFUser currentUser]会在设备上本地缓存.我有一个问题,即存储在该用户对象中的一些自定义数据可以在应用程序之外更新,因此如果用户仍然登录,则调用[PFUser currentUser]将获得缓存的用户对象,因此它将不具有新数据.要更新缓存用户的对象,用户必须注销并重新登录.

如何在不丢弃会话的情况下以编程方式更新/重新获取当前用户?

ios parse-platform pfuser

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

更改流布局的itemSize后,单元格大小未更新

在我的应用程序中,我有一个全屏的分页集合视图,每个单元也需要全屏显示,因此集合视图布局的项目大小必须与视图控制器的视图边界大小相同。为此,viewDidLayoutSubviews我只是设置项目大小,并且它按预期工作。当我显示此屏幕时,它viewDidLayoutSubviews被调用3次,并且每次iPhone 7的视图边界尺寸为375.0 x 667.0。该单元的尺寸与预期的相同。

但是,当使用3D Touch窥视和弹出显示此屏幕时,无论是窥视还是弹出,单元格的大小都没有达到预期的大小。viewDidLayoutSubviews被称为4次,具有以下边界大小:

--- peek triggered ---
375.0 x 569.524495677234
375.0 x 569.524495677234
375.0 x 720.821325648415
--- pop triggered ---
375.0 x 667.0
Run Code Online (Sandbox Code Playgroud)

窥视时,集合视图将按预期以全屏方式显示,高度为721,单元格的预期宽度为375,但单元格的高度应为569(当单元格高度为721时)。在弹出时,集合视图的高度将更改达到预期的667,但像元高度仍为569。

我尝试collectionView.layoutIfNeeded()在设置后致电,itemSize但结果是一样的。为什么集合视图不更新此处的单元格大小?

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    print("\(view.bounds.width) x \(view.bounds.height)")

    let boundsSize = CGSize(width: Int(view.bounds.width), height: Int(view.bounds.height))
    let flowLayout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout

    if flowLayout.itemSize != boundsSize {
        flowLayout.itemSize = boundsSize

        collectionView.layoutIfNeeded() //this doens't help
    }
}
Run Code Online (Sandbox Code Playgroud)

ios uicollectionview uicollectionviewcell uicollectionviewlayout

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

有效创建包含大量部分和项目的 NSDiffableDataSourceSnapshot

考虑到需要创建一个包含数百个部分的数十万项的静态集合视图,如何有效地创建NSDiffableDataSourceSnapshot

在Apple的示例代码中,UsingCollectionViewCompositionalLayoutsAndDiffableDataSources它们遵循以下模式:

let itemsPerSection = 1000
let sections = Array(0..<250)
var snapshot = NSDiffableDataSourceSnapshot<Int, Int>()
var itemOffset = 0
sections.forEach {
    snapshot.appendSections([$0])
    snapshot.appendItems(Array(itemOffset..<itemOffset + itemsPerSection))
    itemOffset += itemsPerSection
}
Run Code Online (Sandbox Code Playgroud)

每个部分和项目都必须是唯一的标识符。效率低下的原因在于创建 1000 个数组Int,并执行 250 倍。在此示例中,在我的设备上生成大约需要 12 秒。

是否有不同的方法可以有效地生成此结构,是否有任何方法可以避免预先生成它,或者这对于快照架构来说是不可能的吗?

uicollectionview ios13

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

通过 UIViewRepresentable 在 SwiftUI 中调整 UILabel 的大小,如 Text 以包裹多行

目标是获得一个UILabel集成通孔UIViewRepresentable以相同的方式调整大小Text- 使用可用宽度并换行到多行以适应所有文本,从而增加HStack其所在的高度,而不是无限扩展宽度。这是非常相似的这个问题,但接受的答案不适合我使用涉及的布局工作ScrollViewVStackHStack

struct ContentView: View {
    var body: some View {
        ScrollView {
            VStack {
                HStack {
                    Text("Hello, World")
                    
                    Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla tempor justo quam, quis suscipit leo sollicitudin vel.")
                    
                    //LabelView(text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla tempor justo quam, quis suscipit leo sollicitudin vel.")
                }
                HStack {
                    Text("Hello, World")
                    
                    Text("Lorem ipsum dolor sit amet, …
Run Code Online (Sandbox Code Playgroud)

uilabel ios swiftui uiviewrepresentable

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

当系统外观更改时,SwiftUI ButtonStyle 动画会导致应用程序切换器快照中的 UI 不更新

在我的应用程序中,我有一个按钮,我想在触摸它时以动画方式缩小。为此,我创建了一个ButtonStyle具有显式animation. 这按预期工作,但在暗/亮模式系统外观之间切换时引入了问题。如果您在应用程序打开时更改它,Color则会按预期更新,但如果应用程序未打开,应用程序切换器中的快照将显示新系统外观的错误颜色。以下代码在浅色模式下应该是白色背景上的黑框,在深色模式下应该是黑底白字。背景始终会正确更新,但方框在快照中仍保持旧颜色,因此您无法看到它 - 黑底黑字或白底白字 - 至少从 iOS 14.2 开始是这样。问题是animation- 如果我删除快照,则会按预期显示。这是为什么?我该如何解决它?

struct ContentView: View {
    var body: some View {
        Button(action: {}) {
            Color.primary
                .frame(height: 100)
        }
        .buttonStyle(MyButtonStyle())
        .padding()
    }
}

struct MyButtonStyle: ButtonStyle {
    func makeBody(configuration: Self.Configuration) -> some View {
        configuration.label
            .scaleEffect(configuration.isPressed ? 0.8 : 1)
            .animation(.easeOut(duration: 0.5)) //FIXME: Removing this fixes it
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我在浅色模式下运行应用程序,然后关闭它,启用深色模式,然后打开应用程序切换器,发现该框在黑色背景上是黑色的。该框应该是白色的,就像我点击应用程序将其返回前台时一样。

截图

ios swift swiftui ios-darkmode swiftui-14.2-defect

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

检测BOOL可用性以支持多个iOS版本?

我试图找出如何检测外部BOOL是否可用以便我可以支持iOS 7和8. iOS 8中的新功能是一个BOOL,您可以使用它来查明是否启用了Reduce Transparency,并且我想实现检查if语句,但这将在iOS 7上崩溃而不首先检查外部BOOL是否可用.我很惊讶我无法从网络搜索中找到答案.

这是BOOl的定义:

UIKIT_EXTERN BOOL UIAccessibilityIsReduceTransparencyEnabled() NS_AVAILABLE_IOS(8_0);
Run Code Online (Sandbox Code Playgroud)

我正在使用它的位置:

if (UIAccessibilityIsReduceTransparencyEnabled()) {
    NSLog(@"transparency is disabled");
}
Run Code Online (Sandbox Code Playgroud)

boolean objective-c backwards-compatibility ios

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