0

私は UIScrollView を持っています。その唯一の使命は、カメラから、または写真ライブラリから選択された単一の写真トークンを表示することです。

しかし、問題が 1 つあります。写真の向きです。

つまり、「縦」の写真 (高さ > 幅の写真) と「横」の写真 (幅 > 高さ) です。

そして、私が欲しいのは、システムの写真アプリで 1 枚の写真を表示するようなものです。

垂直写真と水平写真の両方を快適にズームできます

まず、これが私のカスタム PhotoView のコードです (主に UIScrollView と UIImageView を制御します)。

// .h
@interface PhotoView : UIView
<UIScrollViewDelegate>{
    UIScrollView *myScrollView;
    UIImageView *photoView;
}
...
@end
// .m
- (void)refreshPhoto:(UIImage *)aPhoto {
    if (aPhoto) {
        CGSize photoSize = aPhoto.size;
        CGSize scrollSize = self.myScrollView.frame.size;
        if (photoSize.height > photoSize.width) { // vertical photo
            self.photoView.frame = CGRectMake(0, 0, scrollSize.width, scrollSize.height);
        }
        else { // horizontal photo, initially it should be zoomed out to fit the width of myScrollView
            CGFloat factor = photoSize.width / scrollSize.width;
            self.photoView.frame = CGRectMake(0, 0, scrollSize.width, photoSize.height / factor);
            self.photoView.center = CGPointMake(scrollSize.width / 2, scrollSize.height / 2);
        }
    }
    else  // no photo
        self.photoView.frame = self.myScrollView.frame;
    self.photoView.image = aPhoto;
    //self.myScrollView.zoomScale = 1.0;
    //self.myScrollView.contentSize = self.photoView.frame.size;
}
- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"photoViewBg.png"]];
        self.myScrollView = [[[UIScrollView alloc] initWithFrame:CGRectMake(30, 35, 260, 360)] autorelease];
        self.myScrollView.delegate = self;
        self.myScrollView.maximumZoomScale = 2.5;
        self.myScrollView.minimumZoomScale = 1.0;
        self.myScrollView.backgroundColor = [UIColor clearColor];
        self.photoView = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)] autorelease];
        self.myScrollView.contentSize = self.imageView.frame.size;
        [self.myScrollView addSubview:self.photoView];
        [self addSubview:self.imageView];
    }
    return self;
}
#pragma mark - Scroll View Delegate
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return self.photoView;
}

そして私の問題は、私のコードは最初は縦長の写真でうまく機能しました-写真がどれだけ大きくても小さくても、つまり、

写真をズームしてからmyScrollViewのフレームの外にドラッグすると(デバイス画面の(30、35、260、360))、

常に myScrollView の端に跳ね返ります。

しかし、横向きの写真を扱い始めたとき、物事は混乱しました。

私のコードから、水平写真の最初に必要なのは、水平写真の幅が高さ>高さであるため、myScrollViewの幅が高さ<高さであることがわかります。

したがって、最初は、水平方向のものは myScrollView の中央に配置し、幅は同じで高さを小さくして、上部と下部の両方に 2 つの等しい空白を残します。

次に、ズームおよびスクロールされると、その「バウンス エッジ」も myScrollView のエッジと同じである必要があります。

残念ながら私の下手な英語では自分自身をはっきりと表現することはできません。うまくいかない場合は、IOS デバイスで縦と横の写真を撮り、写真アプリでズームしてドラッグしてみてください。最初に表示され、どのように跳ね返るか。

だから今、私は欲しい効果を得る方法がわかりません.UIScrollViewについては、実際にはそれほど明確ではありません.ドキュメントをすでに数回読んでいます.

myScrollView の contentSize を変えて縦横両方の写真を調整しようとしましたが、まだできていません。

myScrollViewのエッジは、ズームされた写真の正しい「バウンスエッジ」であると思うので、今は常にcontentSizeをmyScrollViewのサイズと同じに設定しています。

しかし、現在、この photoView には、写真が myScrollView から完全にスクロールされて見えなくなったが、まったく跳ね返らないなど、縦向きと横向きの写真の両方の問題があります。

または、上部の「バウンスエッジ」が myScrollView の実際の上端より少し離れており、写真が常にそこに跳ね返り、常に上に空白が残ります。

UIScrollView の仕組みを正しく理解しているかどうかはわかりません。

contentSize は、表示している写真と常に同じにするか、myScrollView に固定する必要があります。

写真がズームインまたはズームアウトされたとき、contentSize も変更されますか、またはまったく変更されませんか?

contenOffset と contentInset を慎重に処理する必要があると思いますが、どうすればよいでしょうか。

誰かが私に助けを提供してくれることを願っています!

どうもありがとう!

4

1 に答える 1

7

私はこれを解決しました.contentSizeとその位置(contentInsetとcontentOffset)に注意してください

以下のコードでこの問題を解決できました。

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    CGSize nowSize = view.frame.size;
    if (nowSize.height >= self.myScrollView.frame.size.height)
        self.myScrollView.contentInset = UIEdgeInsetsZero;
    else {
        CGFloat delta = self.myScrollView.frame.size.height/2 - view.frame.size.height/2;
        self.myScrollView.contentInset = UIEdgeInsetsMake(delta, 0, delta, 0);
    }
}
于 2012-03-03T09:14:39.700 に答える