ios - UIScrollView 不滚动的自定义 UIView 小部件

标签 ios objective-c uiview uiscrollview custom-view

我正在尝试开发一个新的自定义 UIView(以允许水平日期选择)。我想在 XIB 文件中进行所有 UI 设计。

自定义 UI View 包含一个 ScrollView ,然后是两个“周” View 。我的想法是,当滚动发生时,我会将两个“周” View 移动到位并将它们重新配置到正确的日期,以创建一个“无限”滚动以供日期选择。

我可以加载 UIView,然后加载 ScrollView 和周 View (全部在 XIB 中设计)。

我的 DatePickerView 类派生自 UIView 类,它执行 ScrollView (包含两周 View )的 addSubview。 ScrollView 为 320 宽,contentSize 设置为 640 宽。用户交互已启用。水平滚动已启用。

这一切都有效并显示在屏幕上。每个周 View 包含 7 个按钮。我可以按下它们,它们就能触摸到。然而, ScrollView 似乎并不想滚动。

我将自定义 View 设置为 UIScrollViewDelegate。没有调用 scrollViewDidScroll

对于每个周 View ,我都有一个“容器” View ,然后是按钮。我将以下内容添加到容器 View (同样派生自 UIView)。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    DDLogInfo(@"Began.  Next Responder: %@", self.nextResponder);
    [self.nextResponder touchesBegan:touches withEvent:event];
}

(以及其他触摸事件的类似事件,touchesMoved、touchesEnded、touchesCancelled),

我打印出 nextResponder,它是 UIScrollView,所以我知道我正在将触摸发送到 View ,但我从未看到 scrollview 想要滚动。

我将 touchEvents 向上传递到响应链的方法是否正确?
我还需要配置什么才能让滚动正常工作吗?

感谢任何帮助。

查理

最佳答案

如果我没理解错的话,您想要的是只有三页 ScrollView 的无限滚动。我在我的日历 View 项目中实现了类似的效果。 您可以从这里结帐 DPCalendar

简而言之,我创建了一个像

这样的 View
@interface DPCalendarMonthlyView : UIScrollView

然后像这样开始

self.showsHorizontalScrollIndicator = NO;
self.clipsToBounds = YES;
self.contentInset = UIEdgeInsetsZero;
self.pagingEnabled = YES;
self.delegate = self;

我创建了三个这样的 View

[self.pagingViews addObject:[self singleMonthViewInFrame:self.bounds]];
[self.pagingViews addObject:[self singleMonthViewInFrame:CGRectMake(self.bounds.size.width, 0, self.bounds.size.width, self.bounds.size.height)]];
[self.pagingViews addObject:[self singleMonthViewInFrame:CGRectMake(self.bounds.size.width * 2, 0, self.bounds.size.width, self.bounds.size.height)]];

然后我设置内容大小并将其滚动到中间

[self setContentSize:CGSizeMake(self.bounds.size.width * 3, self.bounds.size.height)];
[self scrollRectToVisible:((UIView *)[self.pagingViews objectAtIndex:1]).frame animated:NO];

在scrollview委托(delegate)函数中,我需要做

- (void)scrollViewDidEndDecelerating:(UIScrollView *)sender
{
    //If scroll right
    if(self.contentOffset.x > self.frame.size.width)
    {
        //do something if scroll right
    } else if(self.contentOffset.x < self.frame.size.width)
    {
        //do something else if scroll left
    } else {
        return;
    }
    //scroll back to the middle
    [self scrollRectToVisible:((UICollectionView *)[self.pagingViews objectAtIndex:1]).frame animated:NO];
}

希望对你有用。

关于ios - UIScrollView 不滚动的自定义 UIView 小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21196606/

相关文章:

ios - Phonegap App Store 提交 : ITMS-90683: Missing Purpose String in Info. plist - NFCReaderUsageDescription - 不使用插件

ios - 在 Objective-C 中解析 JSON 的最漂亮方法?

objective-c - Cocoa - 复制邮件按钮栏

iOS:如何以编程方式导航/跳转到导航 Controller 管理的不同场景?

ios - 在 Swift 中更新 View

iOS10 如何隐藏搜索栏的 "x"符号

ios - 如何从 iOS 上的 Facebook SDK 获取用户数据

ios - 如何在 IOS 上使用 Phonegap 读取具有群组名称的联系人

objective-c - 这个 gdb 输出是什么意思?

ios - Xcode:选择 Storyboard之外的对象