2016-08-30 2 views
0

У меня есть UIScrollView с UIImageView в нем. Просто простой тестовый пример: UIImageView имеет полную ширину прокрутки и центрируется на Y с автоматической компоновкой. Тем не менее, в конечном результате на моем устройстве он не находится по центру Y.Zoom UIImageView в UIScrollView - не центрирован

Но у меня есть проблема, что при масштабировании 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) { 

} 

} 

А вот мой тест авто макет:

enter image description here

ответ

0

Я не уверен, можно ли центрировать только с помощью автоматической компоновки. Один из подходов, который работает для меня, заключается в подклассе 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; 

}