我已经根据这种技术实现了分页滚动 (iOS develop. How to extend UIScrollView's scroll event responding area?)并且它的工作方式与预期一致。
我正在滚动的视图包含几个按钮,我希望不仅可以点击滚动视图中心/分页的视图,还可以点击左侧和右侧的视图。我找不到任何方法来解决这个问题,但我还不是真正的iOS-Jedi,希望你们其中一人是:)
因此,从屏幕上可以看出,UIScrollView大约是窗口宽度的三分之一,UIScrollView的内容大得多:大约1500px并且包含许多以编程方式添加的按钮。这个解决方案很酷,实际工作的部分是按钮: 1)被分页到scrollview 2)在滚动视图外部可见(因为滚动视图未选中“剪辑子视图”)3)在uiscrollview中可见时按钮是可点击的。
但是什么不起作用就是这样: - 当前在窗口外的按钮在点击它们时不会收到“他们的”点击,而是将事件转发到底层(窗口的白色部分)视图。
答案 0 :(得分:15)
所以,
我终于设法解决了这个难题,解决方案分为两个 部分。正如你所记得的那样,问题是点击事件没有传到 UIScrollView外部(可见)的按钮。事实证明,点击是由底层视图捕获的,并且可以通过弯曲关于谁被击中的规则来操纵他们找到目标的方式,从而欺骗事件通过你想要的地方。不确定这是应该如何完成,但它解决了我的问题.. :)
1)第一个必须在底部视图中覆盖以下方法 这样它在适当时返回scrollview而不是它自己。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView *view = [super hitTest:point withEvent:event];
if (view == self)
return [self scrollView];
return view;
}
2)scrollView必须覆盖两个方法,将点击移交给其包含的对象。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView *view = [super hitTest:point withEvent:event];
// Always return us.
return view ;
}
和
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
// We want EVERYTHING!
return YES;
}
非常感谢您的评论和愿意提供帮助。 我好
答案 1 :(得分:2)
受到@tommys提到的答案的启发,事实证明,通过覆盖UIView的hinTest方法并返回scrollView,您实际上可以将此UIView的滑动分离到scrollView。
Cursor phones = cr.query(Phone.CONTENT_URI, null, null, null, Phone.DISPLAY_NAME + " ASC");
while (phones.moveToNext())
{
String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phoneNumberString = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Log.e(name, phoneNumberString);
namelist.add(name);
numberlist.add(phoneNumberString);
} //The problem in your code is you need to close this bracket, and call phones.close() after all the items are fetched.Your code calls phone.close() everytime
phones.close();
所以这个UIView就像是scrollView的扩展滚动区域,这个想法就在这里。如果你在scrollView和窗口的相同大小上创建UIView掩码,那么在窗口内的任何位置滑动都会使scrollView滚动。
以下是示例ExtensionScrollArea
答案 2 :(得分:0)
这是我的版本:
在容器中点击测试
- (UIView *) hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if ( CGRectContainsPoint( self.frame, point ) && ! self.hidden ) // <-- *
{
if ( ! CGRectContainsPoint( scrollView.frame, point ) )
return scrollView;
}
return [super hitTest:point withEvent:event];
}
(*)如果您正在移动或以其他方式隐藏您的视图,此标记的行很重要,例如,如果您有多个视图,每个视图都有自己的滚动视图。如果您没有此行,您可能会将所有触摸指向屏幕外滚动视图!
在scrollview中覆盖
- (BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
return YES;
}
(在容器的hitTest中,您可以在if语句中排除其他帧以获取默认行为):)