【问题标题】:Zoom UIImageView in UIScrollView – not centered在 UIScrollView 中缩放 UIImageView – 不居中
【发布时间】:2017-01-06 21:50:17
【问题描述】:

我有一个 UIScrollView,里面有一个 UIImageView。只是一个简单的测试用例: UIImageView 是滚动视图的全宽,并以 Y 为中心,具有自动布局。但是,在我的设备上的最终结果中,它并没有真正以 Y 为中心。

但是我遇到的问题是,当使用滚动视图缩放 UIImageView 时,它会“漂移”到底部区域——而不仅仅是在中心缩放。当缩小时(在视频的最后),它也会“漂移”到左侧并弹回中心。

我为这种行为制作了一个小预览视频:https://www.youtube.com/watch?v=ivRNkzNrcEA

这是我的简单测试代码:

class TestController: UIViewController, UIScrollViewDelegate {

@IBOutlet weak var SCROLL: UIScrollView!
@IBOutlet weak var IMAGE: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()

    SCROLL.minimumZoomScale = 1;
    SCROLL.maximumZoomScale = 6.0;
    SCROLL.zoomScale = 1.0;
    SCROLL.contentSize = IMAGE.frame.size;
    SCROLL.delegate = self;


}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

}

func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
    return IMAGE
}

func scrollViewDidZoom(scrollView: UIScrollView) {

}

func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) {

}

}

这是我的测试自动布局:

【问题讨论】:

    标签: ios swift uiscrollview uiimageview zooming


    【解决方案1】:

    我不确定是否可以仅通过自动布局保持居中。一种对我有用的方法是对UIScrollView 进行子类化并修改layoutSubviews,如Apple WWDC 示例中所示。代码如下

    -(void) layoutSubviews
    {
        [super layoutSubviews];
        UIImageView *v = (UIImageView *)[self.delegate viewForZoomingInScrollView:self];
        //Centering code
    
        CGFloat svw = self.bounds.size.width;
        CGFloat svh = self.bounds.size.height;
        CGFloat vw = v.frame.size.width;
        CGFloat vh = v.frame.size.height;
    
        CGRect f = v.frame;
    
        if (svw > vw)
        {
            f.origin.x = (svw - vw)/2.0;
        }
        else
        {
            f.origin.x = 0;
        }
    
        if (svh > vh)
        {
            f.origin.y = (svh - vh)/2.0;
        }
        else
        {
            f.origin.y = 0;
        }
    
        v.frame = f;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 2019-05-23
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 2012-02-12
      • 2017-09-23
      • 1970-01-01
      • 2019-01-11
      相关资源
      最近更新 更多