【问题标题】:how to get frame of 'screen viewport' in zoomed uiview?如何在缩放的 uiview 中获取“屏幕视口”的框架?
【发布时间】:2015-09-03 21:55:56
【问题描述】:

我有一个 UIImageView,可以通过手势控制进行缩放和平移。 (我没有为此使用 UIScrollView,除了我是根据教程构建的,直到后来才了解滚动视图。)

我想添加另一个视图作为主图像视图的子视图,并且我希望新视图的框架是屏幕上显示的区域。即,如果将主图像放大到非常精细的细节,从而只显示图像的一小部分,那么我希望新视图的框架只是那个可见的部分。

同样,如果主视图被拉远,使其在屏幕上显得非常小,我希望新视图的框架相对较大,包含屏幕上显示的所有内容。

更喜欢 Swift 语言的答案,但我可以从 Objective C 转换。

如果相关:所有这一切的最终应用是用于手势绘图,以便我为用户可能尝试和绘制的区域分配适当数量的空间和资源。如果将新“UIBezierCurveView”的框架放大为整个(高分辨率)图像的框架,则会浪费内存。

【问题讨论】:

    标签: ios swift uiview uiimageview


    【解决方案1】:

    听起来您想要在整个可平移区域上放置某种叠加层。

    您可以在 UIImageView 上方添加一个 UIView。以这种方式:

    -Superview
        -UIView (call this OverlayView)
            -Anything you want on that UIView
        -(pan-able)UIImageView
    

    然后,您只需确保 UIView 不响应触摸事件,并将它们传递给 UIImageView 使用(对不起,Obj-C 虽然很简单):

    //set it to false to let touches go through
    OverlayView.userInteractionEnabled = NO; 
    

    【讨论】:

    • 我不知道这会给我当前的可视区域。除非,有类似newFrame = CGRectInView( OverlayView.frame, imageView)?
    • 那我想我错过了你想要做的事情。从您的解释中很难想象。
    【解决方案2】:

    想通了。为将来出现的任何人发布此答案。解决方案是一行:

    let frame = imageView.convertRect(rootView.bounds, fromView: rootView)
    

    ...其中 imageView 是有问题的 UIImageView,而 rootView 是 Storyboard 中默认提供的 UIView,其中包含 UIImageView。 (无需引入新的叠加层,与 userInteractionEnabled 无关。)

    注意:即使您将 rootView 作为 @IBObject 从 Storyboard 连接到 ViewController.swift,它也不会被分配并返回 nil。 您还必须将 rootView 与 UIImageView 连接,并选择有关它应如何充当 UIImageView 的容器的选项之一(I 我想我选择了水平居中)。只有这样 rootView 才能使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 2013-07-11
      • 2011-07-04
      • 2021-06-03
      相关资源
      最近更新 更多