我有一个UIScrollView(具有清晰的背景),在它后面我有一个UIImage占据了设备高度的1/3左右。为了初始显示坐在滚动视图中的图像,我将scrollviews contentInset设置为使用与图像相同的高度。这正是我想要的,初始化显示图像,但向下滚动最终将覆盖滚动视图内容的图像。
唯一的问题是我在图像上添加了一个按钮。但是它无法触及,因为UIScrollView实际上位于它的顶部(即使由于背景清晰可以看到按钮)。我怎样才能让它发挥作用。
编辑:
以下解决了这个问题:
//viewdidload
self.scrollView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "onScrollViewTapped:"))
...
func onScrollViewTapped(recognizer:UITapGestureRecognizer)
{
var point = recognizer.locationInView(self.view)
if CGRectContainsPoint(self.closeButton.frame, point) {
self.closeButton.sendActionsForControlEvents(UIControlEvents.TouchUpInside)
}
}
答案 0 :(得分:1)
感谢屏幕截图和谷歌地图的参考,你正在寻找你正在寻找的东西,我现在可以看到你在说什么。
我注意到图像是可点击的并且滚动过来但图像本身没有显示按钮。您可以做的是在UIScrollView中放置一个覆盖图像的清晰按钮,以便在您能够看到图像时使其可单击。就我所知,你无法在UIScrollView下单击任何内容。
如果适合您,请告诉我。
答案 1 :(得分:1)
一个简单的解决方案是将文档中的视图重新排序。轮廓中的视图越高,视图作为图层
越低
答案 2 :(得分:0)
要测试两件事:
1)确保包含该按钮的图像的userInteractionEnabled
设置为true
(默认值为false)。虽然,因为按钮是一个子视图并添加在ImageView
(我假设)之上,那么这可能没有帮助。
2)如果这没有帮助,您是否可以将该按钮添加为subview
的{{1}}并将其位置设置为图像的位置?这样它应该保留在图像上,并在用户向下滚动时隐藏,但可点击,因为它是UIScrollView
的孩子。
某些代码和/或图片也会有所帮助。
答案 3 :(得分:0)
我认为这样做的方法是子类化UIScrollView中的任何对象并覆盖touches began
/ touches ended
。然后找出正在触摸的坐标以及它们是否落在按钮的范围内
e.g。在Swift中,这将是:
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent?) {
println("!!! touchesBegan")
if var touch = touches.first {
var touchObj:UITouch = touch as! UITouch
println("touchesBegan \(touchObj.locationInView(self))") //this locationInView should probably target the main screen view and then test coordinates against your button bounds
}
super.touchesBegan(touches, withEvent:event!)
}
答案 4 :(得分:0)
你应该继承UIScrollView
并覆盖-hitTest:withEvent:
,以确保它只吃它应该接触的那些。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView *const inherited = [super hitTest:point withEvent:event];
if (inherited == self) return nil;
return inherited;
}
另外,请务必在图片视图中将userInteractionEnabled
设置为YES
。
答案 5 :(得分:0)
有两种方法可以检查天气触摸事件是否在UIButton上发射?
选项1 :您需要在UITapGesture
上添加UIScrollView
。同时点击UIScrollView。相对于UIScrollView,点击手势返回触摸点。您需要使用以下方法将该触摸点转换为主UIView
(即self.view)。
CGPoint originInSuperview = [superview convertPoint:CGPointZero fromView:subview];
成功对话后,您可以检查天气接触点是否与UIButton
帧或什么相互作用。如果它相互作用,那么您可以执行您要在UIButton
选择器上执行的操作。
CGRectContainsPoint(buttonView.frame, point)
选项2 :用户在iPhone屏幕上触摸时收到第一个触摸事件。并将触摸点重定向到当前UIViewController
。你可以在选项1 描述中检查交互。并执行你的行动。
选项2 已成功集成到我的某个项目中,但我忘记了收到第一个点击事件并重定向到当前控制器的库。当我知道它的名字时,我会提醒你。
愿这对你有所帮助。