gpt4 book ai didi

ios - Xamarin iOS - UIScrollView 内的 UIImageView 在方向改变后移位

转载 作者:行者123 更新时间:2023-11-29 01:12:27 26 4
gpt4 key购买 nike

我在动态添加到 ScrollView 中的 ImageView 时遇到问题。我正在使用 iOS 8 以及尺寸类别和自动布局。 ScrollView 已通过 Storyboard添加,我还添加了约束以匹配 View 的大小。

挑战是,动态添加的 ImageView 开始居中,但方向更改后,它会在 ScrollView 中移位。

这里有大量的解决方案,其中大多数都指向重写 ViewWillLayoutSubviews() 函数,然后将 UIImageView 的中心设置为 ScrollView 的中心。这些建议都不适合我。每当我旋转设备时, ImageView 就会移位。

我尝试过的一些建议

UIScrollView with centered UIImageView, like Photos app

Center UIImageView inside UIScrollView without contentInset?

这是我添加 UIImageView 的方式。该函数在 ViewDidLoad() 中调用。

public void AddImageInScrollView(int index)
{
try
{
//Setting up the imageView

var imageUrl = Items.fetchImages[index];

//Setting up the imageView
imageView = new UIImageView();
//call method to load the images
imageView.SetImage(
url: new NSUrl(imageUrl.AbsoluteUri),
placeholder: UIImage.FromFile("sample.png"),
completedBlock: (image, error, type, url) =>
{
imageResizer = new ImageResizer(image);

imageResizer.RatioResize(100,100);

UIImage resizedImage = imageResizer.ModifiedImage;
//when download completes add it to the list
Car.images.Add(resizedImage);

});
//end method call

imageView.UserInteractionEnabled = true;
imageView.ContentMode = UIViewContentMode.ScaleAspectFit;
imageView.Center = ScrollViewMain.Center;


//Adding the imageView to the scrollView as subView
ScrollViewMain.AddSubview(imageView);

//ScrollViewMain.ContentSize = imageView.Image.Size;
ScrollViewMain.ContentSize = new CGSize(ScrollViewMain.Frame.Size.Width,ScrollViewMain.Frame.Size.Height);
catch (Exception ex)
{

Console.WriteLine(ex.Message + ex.StackTrace);
}
}

ViewWillLayoutSubviews 函数

    public override void ViewWillLayoutSubviews ()
{
base.ViewWillLayoutSubviews ();

imageView.Frame = new CGRect(0,0,ScrollViewMain.Frame.Size.Width,ScrollViewMain.Frame.Size.Height);

CenterScrollViewContents ();
}

CenterScrollViewContents 函数

   public void CenterScrollViewContents()
{
try
{

var boundsSize = ScrollViewMain.Bounds.Size;

var contentsFrame = imageView.Frame;

if (contentsFrame.Size.Width < boundsSize.Width) {

contentsFrame.X = ((float)boundsSize.Width - (float)contentsFrame.Size.Width) / 2.0f;

} else {
contentsFrame.X = 0.0f;
}

if (contentsFrame.Size.Height < boundsSize.Height) {

contentsFrame.Y = ((float)boundsSize.Height - (float)contentsFrame.Size.Height) / 2.0f;

} else {
contentsFrame.Y = 0.0f;
}

imageView.Frame = contentsFrame;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

}

旋转后的屏幕截图示例

Screen shot of displaced image in land scape mode

最佳答案

将您的代码从 ViewWillLayoutSubviews 移至 ViewDidLayoutSubviews。不同的是 ViewWillLayoutSubviews“被调用以通知 View Controller 其 View 将要布局其 subview 。”ViewDidLayoutSubviews“被调用以通知 View Controller 它的 View 刚刚布置了它的 subview 。”

问题是,ScrollViewMain.Frame

{X=0,Y=0,Width=375,Height=667} in ViewWillLayoutSubviews

但是

{X=0,Y=0,Width=667,Height=375} in ViewDidLayoutSubviews

该函数看起来像

public override void ViewDidLayoutSubviews()
{
base.ViewDidLayoutSubviews();
ScrollViewMain.ContentSize = new CGSize(ScrollViewMain.Frame.Size.Width, ScrollViewMain.Frame.Size.Height);
imageView.Frame = new CGRect(0, 0, ScrollViewMain.Frame.Size.Width, ScrollViewMain.Frame.Size.Height);
CenterScrollViewContents();
}

奖金专业提示:

您可以使用 imageView.Center = ScrollViewMain.Center; 使 View 居中。

如果您有更多时间,请查看 Autolayout constraints。它们为您省去了框架计算的麻烦。

关于ios - Xamarin iOS - UIScrollView 内的 UIImageView 在方向改变后移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35579461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com