UIScrollView滚动背景视图

时间:2015-06-17 17:24:36

标签: ios xcode swift uiscrollview

我有一个UIScrollView(具有清晰的背景),在它后面我有一个UIImage占据了设备高度的1/3左右。为了初始显示坐在滚动视图中的图像,我将scrollviews contentInset设置为使用与图像相同的高度。这正是我想要的,初始化显示图像,但向下滚动最终将覆盖滚动视图内容的图像。

唯一的问题是我在图像上添加了一个按钮。但是它无法触及,因为UIScrollView实际上位于它的顶部(即使由于背景清晰可以看到按钮)。我怎样才能让它发挥作用。

enter image description here

enter image description here

编辑:

以下解决了这个问题:

 //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)
            }
        }

6 个答案:

答案 0 :(得分:1)

感谢屏幕截图和谷歌地图的参考,你正在寻找你正在寻找的东西,我现在可以看到你在说什么。

我注意到图像是可点击的并且滚动过来但图像本身没有显示按钮。您可以做的是在UIScrollView中放置一个覆盖图像的清晰按钮,以便在您能够看到图像时使其可单击。就我所知,你无法在UIScrollView下单击任何内容。

如果适合您,请告诉我。

答案 1 :(得分:1)

一个简单的解决方案是将文档中的视图重新排序。轮廓中的视图越高,视图作为图层

越低

enter image description here

答案 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!)
    }

见: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIResponder_Class/index.html#//apple_ref/occ/instm/UIResponder/touchesBegan:withEvent

和: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITouch_Class/index.html#//apple_ref/occ/instm/UITouch/locationInView

答案 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 已成功集成到我的某个项目中,但我忘记了收到第一个点击事件并重定向到当前控制器的库。当我知道它的名字时,我会提醒你。

愿这对你有所帮助。