0

scrollView 内の imgView を中央に配置しようとしています。これにより、ズームインしても適切に中央に配置されたままになります (写真アプリのように)。

画面が最初に読み込まれると、中央に配置されます。ピンチしてズームを開始すると、位置が自動的に調整されるため、画像が中央に配置されなくなります。ピンチ/ズームの前後の写真を参照してください。赤はスクロールビューの背景色です。

ズーム前

ズーム後

imgView を作成し、スクロール ビュー内の中央に配置するために使用しているコードを次に示します。(MonoTouch ですが、Obj-C に簡単に変換する必要があります)

private void LoadPageContent(int page) { //TODO: このパネル/ページに表示する画像または内容を読み込むためにここに配置するコード

        //Each page will have it's own scrollview for scrolling and zooming that image on the page
        var panelScrollView = new UIScrollView();
        _panels.Add (panelScrollView);

        panelScrollView.CanCancelContentTouches=false;
        panelScrollView.ClipsToBounds = true; 

        panelScrollView.MinimumZoomScale = 1f;
        panelScrollView.MaximumZoomScale = 50.0f;
        panelScrollView.MultipleTouchEnabled = true;

        panelScrollView.ScrollEnabled = true;
        panelScrollView.UserInteractionEnabled=true;
        var ui = new UIImage (_assetImages[page], 1.0f, UIImageOrientation.Up);

        UIImageView imgView = new UIImageView(ui);


        panelScrollView.Frame = new RectangleF(scrollView.Frame.Width * (_numberOfPanels - 1),
                                               0,
                                               _pageWidthPortrait,
                                               scrollView.Frame.Height);


        panelScrollView.BackgroundColor = UIColor.Red;

        //scale down image to get proper fitted imgview dimensions
        float nPercentW = (panelScrollView.Frame.Width / (float)imgView.Image.Size.Width);
        float nPercentH = (panelScrollView.Frame.Height / (float)imgView.Image.Size.Height);
        float newPercent;
        if (nPercentH >= nPercentW)
        {
            //wider than it is tall
            newPercent = nPercentW;
        }
        else{
            //taller than it is wide..
            newPercent = nPercentH;
        }
        int newWidth1 = Convert.ToInt32(imgView.Image.Size.Width * newPercent);
        int newHeight = Convert.ToInt32(imgView.Image.Size.Height * newPercent);

        panelScrollView.ViewForZoomingInScrollView += (UIScrollView sv) => { 
            return imgView; 
        };

        imgView.Frame = new RectangleF(0,0,newWidth1, newHeight);
        imgView.Center = new PointF(panelScrollView.Frame.Width /2,
                                    (panelScrollView.Frame.Height/2));


  //ScaleToFill and ScaleAspect fit - i used scaleaspectfit and it had the same problem
  //I tried scaletofill but resizing the imgView to fit the proper view dimensions so it is like an aspect fit, but same problem
        imgView.ContentMode=UIViewContentMode.ScaleToFill;//ScaleAspectFit;
        imgView.UserInteractionEnabled=true;

        panelScrollView.ContentSize = imgView.Image.Size;


        panelScrollView.DidZoom += (object sender, EventArgs e) => {

    };

    panelScrollView.AddSubview(imgView);
    scrollView.AddSubview(panelScrollView);


    }
4

1 に答える 1

2

これは私にとってはうまくいっています

- (void)centerScrollViewContents {

CGSize boundsSize = ScrollView.bounds.size;
CGRect contentsFrame = ImageView.frame;

if (contentsFrame.size.width < boundsSize.width) {
    contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0f;
} else {
    contentsFrame.origin.x = 0.0f;
}

if (contentsFrame.size.height < boundsSize.height) {
    contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0f;
} else {
    contentsFrame.origin.y = 0.0f;
}

ImageView.frame = contentsFrame;

}

このメソッドを呼び出す必要があります

- (void)scrollViewDidZoom:(UIScrollView *)scrollView
于 2013-02-01T14:23:53.273 に答える