【发布时间】:2019-03-29 10:07:39
【问题描述】:
我有一个分页的 UIScrollView,其中填充了 UIImageViews 的集合。滚动视图显示上一页和下一页的预览。
我的目标是让滚动视图的每一页都可以缩放。这是我遇到的问题的 gif 图像,其他页面似乎在图像缩放时改变了它们的坐标:
我相信缩放本身会导致滚动视图的 ContentSize 发生巨大变化,这会使其他所有内容都乱七八糟。
故事板层次结构
[控制器]
---- [UIView]
-------- [UIScrollView],自定义类CapturedResultScrollView
我的UIScrollView 对其父 UIView 有以下约束:
代码
这是CapturedResultScrollView 的实现以及委托:
public class CaptureResultScrollViewDelegate : UIScrollViewDelegate {
public CaptureResultScrollViewDelegate(IHandlePaging pageHandler) {
this.pageHandler = pageHandler ?? throw new ArgumentNullException(nameof(pageHandler));
}
private readonly IHandlePaging pageHandler;
public override UIView ViewForZoomingInScrollView(UIScrollView scrollView) {
var pageIndex = (int)Math.Round(scrollView.ContentOffset.X / scrollView.Frame.Size.Width);
return pageHandler.Pages[pageIndex];
}
}
public interface IHandlePaging {
UIImageView[] Pages { get; set; }
}
public partial class CaptureResultScrollView : UIScrollView, IHandlePaging {
public CaptureResultScrollView(IntPtr handle) : base(handle) {
MinimumZoomScale = 1.0f;
MaximumZoomScale = 3.0f;
ZoomScale = 1.0f;
PagingEnabled = true;
ClipsToBounds = false;
ShowsHorizontalScrollIndicator = false;
ShowsVerticalScrollIndicator = false;
Delegate = new CaptureResultScrollViewDelegate(this);
}
public UIImageView[] Pages { get; set; }
public void Setup(IList<CapturedResultModel> capturedResults) {
// setup called from another controller during segue
Pages = new UIImageView[capturedResults.Count];
var pageSize = Frame.Size;
ContentSize = new CGSize(pageSize.Width * Pages.Length, pageSize.Height);
for (int page = 0; page < capturedResults.Count; page++) {
var imageView = new UIImageView() {
// hardcoded value allow for preview of previous/next pages.
Frame = new CGRect(pageSize.Width * page, 0, pageSize.Width - 30, pageSize.Height),
ContentMode = UIViewContentMode.ScaleAspectFill,
Image = UIImage.FromFile(capturedResults[page].ResultImagePath),
ClipsToBounds = true
};
AddSubview(imageView);
Pages[page] = imageView;
}
}
}
当包含控制器的ViewWillAppear事件被触发时调用CaptureResultScrollView的Setup方法如下:
public override void ViewWillAppear(bool animated) {
base.ViewWillAppear(animated);
CapturedResultScrollView.Setup(CapturedResults);
}
我在这里做错了什么?
【问题讨论】:
标签: c# ios xamarin.ios uiscrollview zooming