在iOS 7应用程序(例如"设置")中,当您点击"常规"等行时,从屏幕左侧滑动,可以看到所选行背景颜色的取消选择从灰色变为白色,并且完全消失交互式 - 如果你向上滑动一半然后向后滑动则返回灰色.
在我的应用程序中,我没有更改任何默认行为,当我从左侧滑动返回时,所选的单元格背景颜色保持完全灰色,直到滑动手势完成,然后它快速淡化为白色.
如何通过滑动实现行的交互取消选择以返回手势?
我有一个没有alpha通道的图像 - 我在Finder的"获取信息"面板中确认.然而,当我把它放在a UIImageView中UIScrollView并且我启用Show Blended Layers时,图像是红色的,这表明它正在尝试应用透明度,这将会影响性能.
如何解决这个问题是绿色的,所以iOS知道这个视图中的一切都是完全不透明的?
我尝试了以下但是没有删除红色:
self.imageView.opaque = YES;
self.scrollView.opaque = YES;
Run Code Online (Sandbox Code Playgroud) 我正在实现从我的应用程序中添加和删除iOS日历中用户创建的事件的功能.我已经为用户创建活动时编写了访问日历的权限请求,并且它运行良好.我将事件保存在服务器上,我允许它们稍后删除事件,当发生这种情况时,我也会从日历中删除事件.有人可以在此应用程序之外创建事件,打开应用程序,然后删除从服务器获取的约会.在这种情况下,日历中没有事件存储,但它仍然需要查看是否存在尝试删除它的事件,并且它失败了,因为在这种情况下我没有要求用户允许访问日历.
但我不想在删除时要求用户提供权限,因为用户不知道应用程序为什么要访问日历,因为他们从来不知道它可以将约会保存到日历 - 他们在网站上创建了它,并且他们没有理由在那个时候批准它,因为它无论如何都不会做任何事情.
因此,我的问题是,是否可以确定您的应用当前是否可以访问日历而不提出请求,这将导致在未授予权限的情况下向用户显示自动警报 - 请参阅下面的请求代码?我只是想搜索事件,试图删除它只有我已经有权访问日历,如果我没有,我不会尝试删除任何东西.
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (granted) {
//already have access or user tapped on Allow in popup
}
...
Run Code Online (Sandbox Code Playgroud) 当你实现cameraOverlayView了UIImagePickerController,而你正在服用的照片出现这一观点和照片被服用后,为您提供一个机会,取消或重新拍照.我看到的问题是,如果你cameraOverlayView在照片预览区域的顶部,当你拍摄照片并显示预览时,你拍摄的照片就不再与照片对齐cameraOverlayView了.整个照片预览窗格已经移动了约50个点,同时cameraOverlayView保持原位.当您需要将照片与视图完美对齐时,这是一个问题.
如何调整它以使两者完美对齐 - 拍摄照片时以及照片拍完后?
请注意拍摄照片后如何按下整个预览区域.

我正在实现一个集合视图,其项目的大小基于集合视图的边界.因此,当尺寸改变时,例如,由于旋转设备,我需要使布局无效,以便调整单元格的大小以考虑新的集合视图边界.我是通过viewWillTransitionToSizeAPI 完成的.
这很有效,直到用户在包含集合视图的视图控制器上呈现模态视图控制器,旋转设备,然后解除它.发生这种情况时,项目大小未更新为适当的大小.viewWillTransitionToSize调用并且布局按预期无效,但集合视图的边界仍然是旧值.例如,当从纵向旋转到横向时,集合视图边界值的高度仍然大于宽度.我不确定为什么会这样,但我想知道这是否是改变尺寸无效的最佳方法?有没有更好的方法呢?
我也尝试过子类化UICollectionViewFlowLayout和覆盖shouldInvalidateLayoutForBoundsChange返回YES,但由于某种原因,即使没有模态演示也无法旋转.它也没有使用正确的集合视图边界.
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(nonnull id<UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[self.collectionView.collectionViewLayout invalidateLayout];
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> __nonnull context) {
[self.collectionView.collectionViewLayout invalidateLayout];
} completion:^(id<UIViewControllerTransitionCoordinatorContext> __nonnull context) {
//finished
}];
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewFlowLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
//collectionView.bounds.size is not always correct here after invalidating layout as explained above
}
Run Code Online (Sandbox Code Playgroud)
我也尝试在完成块中使用它,但它仍然没有使用正确的集合视图边界.
如果我再次使布局无效,则会viewWillAppear使用正确的集合视图边界,这可以通过使用模态显示的视图控制器进行旋转来解决问题.但这不应该是必要的,也许还有其他情况,这将不适当的大小.
想象一下,你已经构建了一个使用sheetAPI 来呈现模式表的屏幕,现在你想fullScreenCover在 iOS 14 上运行时使用 SwiftUI 2.0 。你是怎么做到的?Xcode 提供建议:
如果您使用#available 版本检查,它会用#available 包装所有范围内的代码,因此您必须复制所有这些以更改那一行代码。如果使用@available,则必须复制整个结构。
有没有办法让“内联”逻辑说明 iOS 14 是否添加了这个修饰符,否则回到这个修饰符,而不必复制所有其余的视图代码?
一个例子:
VStack {
//a lot of other views here
}
.sheet(isPresented: self.$showingSomeView) { //TODO: Replace sheet with fullScreenCover for iOS 14+
SomeView()
}
Run Code Online (Sandbox Code Playgroud) 当视图仅在 iOS 14 上可用但您的应用可用于 iOS 13 时,如何向视图添加视图修饰符?
例如,textCase(_)。iOS 14 中的部分标题是大写的,因此要使用您应该.textCase(.none)在 上设置的标题文本的大小写Text,但这直到 iOS 14 才存在。
Section(header:
Text("Header")
.textCase(.none) //FIXME: 'textCase' is only available in iOS 14.0 or newer
.font(.system(size: 14, weight: .bold))
.foregroundColor(.secondary)
.padding(.top, 50)
)
Run Code Online (Sandbox Code Playgroud)
Xcode 提供了一些建议:
如果您使用#available 版本检查,它会用#available 包装所有范围内的代码,因此您必须复制所有这些以添加那一行代码。如果使用 @available,则必须复制整个 body 属性或整个结构。
我考虑创建我自己的 ViewModifier ,它只会在 iOS 14 时应用它,但这会产生这个可怕的错误:
函数声明了一个不透明的返回类型,但其主体中的返回语句没有匹配的底层类型
struct CompatibleTextCaseModifier: ViewModifier {
func body(content: Content) -> some View {
if #available(iOS 14.0, *) {
return content …Run Code Online (Sandbox Code Playgroud) 如何创建一个AppIntent将在您的应用程序进程中运行并在您的小部件中使用它的程序Button?我创建了一个新文件,将其添加到我的应用程序的目标中,创建了我的 AppIntent 结构,然后向我的小部件添加了一个按钮:Button(intent: TestIntent()) { Text("Test") }。这会导致编译时错误Cannot find \'TestIntent\' in scope,这是有道理的,因为我尝试使用它的小部件扩展中不存在此代码。但是向小部件添加交互性的文档指出:
\n\n对于小部件,创建一个采用 AppIntent 协议的新结构并将其添加到您的应用程序目标中...在协议\xe2\x80\x99s 所需的 Perform() 函数中,添加您想要提供给应用程序的操作的代码小部件。
\n
和
\n\n\n如果您采用 AppIntent 协议,您可以将自定义应用程序意图添加到小部件扩展目标或应用程序目标。将其添加到应用程序目标是更好的选择,因为您可以在应用程序中重复使用添加到小部件的按钮或切换按钮。
\n
和
\n\n\n当用户与小部件中的按钮或切换开关交互时,系统会在您的 app\xe2\x80\x99s 进程中运行 Perform() 函数。
\n
我想利用UITableViewCelliOS 8 中的动态高度新功能.我需要放置UICollectionView一个UITableViewCell.我想确保集合视图中的所有单元格都在屏幕上可见,因此表格单元格的高度应该增加以适合集合视图.我几乎有这个工作.我只是无法使表格单元格大小合适 - 它的长度太长或太短,并且在我与表格交互之前会看到一些布局问题(更多内容见下文).
我已经将集合视图的自动布局约束设置为表格的单元格contentView:前导,尾随,顶部和底部.然后我在集合视图上创建了一个高度约束,这样我就可以constant在计算适当的高度后动态更新它以适应集合视图中的所有单元格(因为我认为没有办法自动执行此操作).
这是设置的其余部分.
viewDidLoad {
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 44
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
let cellDimension = self.collectionView.frame.size.width / 7 //always 7 columns
let flowLayout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout
flowLayout.itemSize = CGSizeMake(cellDimension, cellDimension)
self.collectionViewHeightConstraint.constant = cellDimension * 4 //always 4 rows
}
Run Code Online (Sandbox Code Playgroud)
我没有实施heightForRowAtIndexPath.
此设置会导致冲突的垂直约束.我已经尝试降低约束的优先级并在一堆组合中改变关系,但没有一个导致所需的行为.如果我将高度约束的优先级降低到999,则表格视图单元格最初太高,但在我向上和向下滚动表格视图后,表格单元格高度更新为预期高度.对于其他一些组合,结果是表格单元格太短但整个集合视图渗出,表格单元格太短而集合视图被切断,或者表格单元格太高,基于什么优先级和我已经应用于约束的关系.此外,在视图设置为动画时,集合视图单元格不会以适当的大小显示(但它们会在动画完成时正确调整),或者如果我重新加载表格,则集合视图单元格的大小不正确,直到我滚动桌子.
如何解决这些外观问题以获得动态表格视图单元格高度,其中包含基于显示宽度的动态单元格大小的完全可见的集合视图?
我正在尝试确定a中给定字符串出现的索引String,然后NSRange使用这些索引生成一个以便为a添加属性NSMutableAttributedString.问题是rangeOfString退货,Range<Index>但addAttributes:range:预计会有NSRange.我尝试NSRange从开始和结束索引创建Range失败,因为String.CharacterView.Index不是Int,因此它不会编译.
如何使用Range<Index>值来创建NSRange?
var originalString = "Hello {world} and those who inhabit it."
let firstBraceIndex = originalString.rangeOfString("{") //Range<Index>
let firstClosingBraceIndex = originalString.rangeOfString("}")
let range = NSMakeRange(firstBraceIndex.startIndex, firstClosingBraceIndex.endIndex)
//compile time error: cannot convert value of type Index to expected argument type Int
let attributedString = NSMutableAttributedString(string: originalString)
attributedString.addAttributes([NSFontAttributeName: boldFont], range: range)
Run Code Online (Sandbox Code Playgroud) ios ×10
objective-c ×3
swiftui ×3
swift ×2
uitableview ×2
appintents ×1
autolayout ×1
calendar ×1
ekeventstore ×1
ios14 ×1
ios17 ×1
nsrange ×1
range ×1
uiimage ×1
uiimageview ×1
uiscrollview ×1
widgetkit ×1