Ios 为什么使用UIScrollView';s的内容不居中?
我将Ios 为什么使用UIScrollView';s的内容不居中?,ios,swift,Ios,Swift,我将UIImageView嵌入UIContentView中,以使其可缩放和可移动(.问题是图像未正确居中。看起来整个图像内容已从左上角移出: 打印内容偏移量接近零时:内容偏移量为:(0.0,-20.0) 以下是我的实现: import UIKit class ZoomableImageView: UIScrollView { private struct Constants { static let minimumZoomScale: CGFloat = 0.5;
UIImageView
嵌入UIContentView
中,以使其可缩放和可移动(.问题是图像未正确居中。看起来整个图像内容已从左上角移出:
打印内容偏移量接近零时:内容偏移量为:(0.0,-20.0)
以下是我的实现:
import UIKit
class ZoomableImageView: UIScrollView {
private struct Constants {
static let minimumZoomScale: CGFloat = 0.5;
static let maximumZoomScale: CGFloat = 6.0;
}
// public so that delegate can access
public let imageView = UIImageView()
// gw: must be called to complete a setting
public func setImage(image: UIImage) {
imageView.image = image
imageView.bounds = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
self.contentSize = image.size
let scaleFitZoomScale: CGFloat = min(
self.frame.width / image.size.width ,
self.frame.height / image.size.height
)
// reset scale and offset on each resetting of image
self.zoomScale = scaleFitZoomScale
}
// MARK - constructor
init() {
// gw: there is no super.init(), you have to use this constructor as hack
super.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0)) // gw: relies on autolayout constraint later
minimumZoomScale = Constants.minimumZoomScale
maximumZoomScale = Constants.maximumZoomScale
addSubview(imageView)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
视图控制器:
class ViewController: UIViewController, UIScrollViewDelegate {
let zoomableImageView = ZoomableImageView()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(zoomableImageView)
zoomableImageView.delegate = self
}
override func viewDidLayoutSubviews() {
zoomableImageView.frame = view.frame
let image = UIImage(imageLiteralResourceName: "kelly")
zoomableImageView.setImage(image: image)
}
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
// print("scale factor is: \(scrollView.zoomScale)")
return zoomableImageView.imageView
}
func scrollViewDidZoom(_ scrollView: UIScrollView) {
print("scale factor is: \(scrollView.zoomScale)")
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
print("content offset is: \(scrollView.contentOffset)")
}
}
但是,如果我不将UIImageView
和UIScrollView
包装在自定义类下,图像的居中效果非常好:
class ViewController: UIViewController, UIScrollViewDelegate {
let imageView: UIImageView = {
let image = UIImage(imageLiteralResourceName: "kelly")
let imageView = UIImageView(image: image)
imageView.bounds = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
return imageView
} ()
let scrollView: UIScrollView = {
let scrollView = UIScrollView()
return scrollView
} ()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
view.addSubview(scrollView)
scrollView.addSubview(imageView)
scrollView.delegate = self
self.scrollView.minimumZoomScale = 0.5;
self.scrollView.maximumZoomScale = 6.0;
}
override func viewDidLayoutSubviews() {
scrollView.frame = view.frame
if let size = imageView.image?.size {
scrollView.contentSize = size
}
}
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return imageView
}
}
我在第一个实现中遗漏了什么吗?在
缩放图像视图
类中,您正在设置边界
当它应该是帧
因此,改变:
imageView.bounds = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
到
在
ZoomableImageView
类中,您正在设置边界
当它应该是帧
因此,改变:
imageView.bounds = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
到
不完全清楚您想要什么…如果图像的实际大小小于scrollView框架(根据您的代码,它是完整的主视图框架),是否希望图像最初在水平和垂直方向居中显示?如果图像大于框架,是否希望图像居中,但已缩放以使整个图像可见?还是居中,使侧面/顶部和底部延伸到scrollView框架之外?我正在尝试使图像左上角与Scroll匹配l查看左上角。这是使用第二个IML自动实现的,但是第一个IML的行为不同(图像从左上角移出)OK-我认为很简单,在您的
ZoomableImageView
类中,您正在设置bounds
当它应该是frame
——所以更改imageView.bounds=cRect(x:0,y:0,width:image.size.width,height:image.size.height)
到imageView.frame=…
@DonMag工作得很好。该死的UI编程很难。我添加了这个作为答案,以便将来可能遇到它的任何人都能看到“修复”。不完全清楚您想要什么…如果图像的实际大小小于scrollView框架(根据您的代码,它是完整的主视图框架),是否希望图像最初在水平和垂直方向居中显示?如果图像大于框架,是否希望图像居中,但已缩放以使整个图像可见?还是居中,使侧面/顶部和底部延伸到scrollView框架之外?我正在尝试使图像左上角与Scroll匹配l查看左上角。这是使用第二个IML自动实现的,但是第一个IML的行为不同(图像从左上角移出)OK-我认为很简单,在您的ZoomableImageView
类中,您正在设置bounds
当它应该是frame
——所以更改imageView.bounds=cRect(x:0,y:0,width:image.size.width,height:image.size.height)
到imageView.frame=…
@DonMag工作得很好。该死的UI编程很难。我添加了这个作为一个答案,以便将来可能遇到它的任何人都能看到“修复”。