Mobile Safari允许您通过进入一种底部带有页面控件的UIScrollView水平分页视图来切换页面.

我试图复制这种特殊的行为,即水平滚动的UIScrollView显示下一个视图的一些内容.

Apple提供的示例:PageControl展示了如何使用UIScrollView进行水平分页,但所有视图都占据整个屏幕宽度.

如何获得UIScrollView,以便像mobile Safari那样显示下一个视图的某些内容?

推荐答案

启用分页的UIScrollView将在其帧宽度(或高度)的倍数处停止.所以第一步是弄清楚你想要你的页面有多宽.就让它和UIScrollView号一样宽吧.然后,将子视图的大小设置为您需要的大小,并根据UIScrollView宽度的倍数设置它们的中心.

然后,既然您想要查看其他页面,当然可以按照mhjoy所述将clipsToBounds设置为NO.现在的诀窍部分是当用户开始拖动到UIScrollView的帧范围之外时使其滚动.我的解决方案(当我最近不得不这么做的时候)是这样的:

创建一个包含UIScrollView及其子视图的UIView子类(即ClipView).基本上,它应该有一个框架,你会认为UIScrollView在正常情况下会有.将UIScrollView放置在ClipView的中心.如果ClipView的宽度小于其父视图的宽度,请确保ClipViewclipsToBounds设置为YES.此外,ClipView需要引用UIScrollView.

最后一步是覆盖ClipView内部的- (UIView *)hitTest:withEvent:.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
  return [self pointInside:point withEvent:event] ? scrollView : nil;
}

这基本上将UIScrollView的touch 区域扩展到其父视图的框架,这正是您需要的.

另一种 Select 是子类UIScrollView并覆盖它的- (BOOL)pointInside:(CGPoint) point withEvent:(UIEvent *) event方法,但是您仍然需要一个容器视图来进行裁剪,并且可能很难仅根据UIScrollView的帧来确定何时返回YES.

NOTE: You should also take a look at Juri Pakaste's 100 if you are having issues with subview user interaction.

Ios相关问答推荐

SwiftUI@Observable不跟踪父类属性中的更改以更新视图

如何将Safari调试器附加到Turbo-iOS原生应用中的模拟器

如何将模糊输入/模糊输出添加到SwiftUI中的非对称过渡?

为什么EKEventStore().questFullAccessToEvents()可以与模拟器一起使用,而不能与真实设备一起使用?

使用标头UICollectionViewFlowLayout时的简单SwiftUI视图错误

在 React Native iOS 中加载多个 JS 包

使用 Xamarin 将 dext Bundle 到 iOS .ipa 中

NSError 错误领域: "CBATTErrorDomain" 代码: 128 0x0000000282b111a0

iOS设备网页自动化中,在向字段发送文本后未启用按钮

如何解决错误 HE0004:无法在 Visual Studio 2022 中加载框架ContentDeliveryServices

Flutter iOS 构建失败:DVTCoreDeviceEnabledState_Disabled

Xcode 13.4.1 (13F100)Command CodeSign 失败,退出代码非零我应该删除哪个证书?

async/await、Task 和 [weak self]

UICollectionView 添加 UICollectionCell

如何从一个特定的视图控制器中隐藏导航栏

try 在 iOS 中处理后退导航按钮操作

如何计算 Swift 数组中元素的出现次数?

iOS 7 及更高版本: for each 视图控制器设置状态栏样式

如果我的分发证书过期会怎样?

值/对象的 NSDictionary 键?