0

ねえ、私はこのチュートリアルに従っています現在、最初のステップにありますが、奇妙な動作が発生しています。このチュートリアルは、画像のスクロール ビューの作成に関するものであり、ページ コントローラーを使用してページ化された水平 ScrollView を作成する方法を示して終了します。最初のセクションに従ったところ、問題なく動作しているように見えました。しかし、コードを実行すると正しく動作しませんでした。約 1 時間のデバッグを行った後、最終的なプロジェクトをダウンロードし、電話で実行して正しく動作しているかどうかを確認し (動作していました)、コードを必要なファイルにコピーしました。事業。私のプロジェクトはまだ実行されません。だから私はそれが私のストーリーボードがプロジェクトのセットアップで設定された方法であるに違いないと考えました. 次に、作業例を開き、ストーリーボードをクリアし、プロジェクトで行ったのとまったく同じ方法と順序で、ビューとセグエを作成しました。バム!それはまだ働いていた、ストーリー ボードのすべてのビューを削除し、まったく同じ方法でそれらを再作成したとき、まだ何もありません。誰かがこのチュートリアルを調べて、私が夢中になっているのか、それとも同様の結果が得られているのか教えてもらえますか. 私はそれを 2 つの可能性に絞り込みました。チュートリアルの最後に提供されたプロジェクトが別の方法で作成され、デリゲートまたはアウトレットがプロジェクトでのみ機能する方法で接続されていたか、プロジェクトが以前のバージョンの現在のバージョンの XCode では動作するが、新しいプロジェクトを作成するときには動作しない iPhone 開発キット。繰り返しになりますが、私はこれにかなり慣れていないので、使用しているコードを捨てて、最善を尽くします。私は夢中になるか、彼らは同様の結果を経験します. 私はそれを 2 つの可能性に絞り込みました。チュートリアルの最後に提供されたプロジェクトが別の方法で作成され、デリゲートまたはアウトレットがプロジェクトでのみ機能する方法で接続されていたか、プロジェクトが以前のバージョンの現在のバージョンの XCode では動作するが、新しいプロジェクトを作成するときには動作しない iPhone 開発キット。繰り返しになりますが、私はこれにかなり慣れていないので、使用しているコードを捨てて、最善を尽くします。私は夢中になるか、彼らは同様の結果を経験します. 私はそれを 2 つの可能性に絞り込みました。チュートリアルの最後に提供されたプロジェクトが別の方法で作成され、デリゲートまたはアウトレットがプロジェクトでのみ機能する方法で接続されていたか、プロジェクトが以前のバージョンの現在のバージョンの XCode では動作するが、新しいプロジェクトを作成するときには動作しない iPhone 開発キット。繰り返しになりますが、私はこれにかなり慣れていないので、使用しているコードを捨てて、最善を尽くします。または、プロジェクトは、現在のバージョンの XCode で動作する以前のバージョンの iPhone 開発キットで作成されましたが、新しいプロジェクトを作成するときには動作しません。繰り返しになりますが、私はこれにかなり慣れていないので、使用しているコードを捨てて、最善を尽くします。または、プロジェクトは、現在のバージョンの XCode で動作する以前のバージョンの iPhone 開発キットで作成されましたが、新しいプロジェクトを作成するときには動作しません。繰り返しになりますが、私はこれにかなり慣れていないので、使用しているコードを捨てて、最善を尽くします。

ViewController.hファイル:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIScrollViewDelegate>

@property (nonatomic, strong) IBOutlet UIScrollView *scrollView;

@end

ViewController.mファイル:

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic, strong) UIImageView *imageView;

- (void)centerScrollViewContents;
- (void)scrollViewDoubleTapped:(UITapGestureRecognizer*)recognizer;
- (void)scrollViewTwoFingerTapped:(UITapGestureRecognizer*)recognizer;
@end

@implementation ViewController

@synthesize scrollView = _scrollView;

@synthesize imageView = _imageView;

- (void)centerScrollViewContents {
    CGSize boundsSize = self.scrollView.bounds.size;
    CGRect contentsFrame = self.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;
    }
    
    self.imageView.frame = contentsFrame;
}

- (void)scrollViewDoubleTapped:(UITapGestureRecognizer*)recognizer {
    // Get the location within the image view where we tapped
    CGPoint pointInView = [recognizer locationInView:self.imageView];
    
    // Get a zoom scale that's zoomed in slightly, capped at the maximum zoom scale specified by the scroll view
    CGFloat newZoomScale = self.scrollView.zoomScale * 1.5f;
    newZoomScale = MIN(newZoomScale, self.scrollView.maximumZoomScale);
    
    // Figure out the rect we want to zoom to, then zoom to it
    CGSize scrollViewSize = self.scrollView.bounds.size;
    
    CGFloat w = scrollViewSize.width / newZoomScale;
    CGFloat h = scrollViewSize.height / newZoomScale;
    CGFloat x = pointInView.x - (w / 2.0f);
    CGFloat y = pointInView.y - (h / 2.0f);
    
    CGRect rectToZoomTo = CGRectMake(x, y, w, h);
    
    [self.scrollView zoomToRect:rectToZoomTo animated:YES];
}

- (void)scrollViewTwoFingerTapped:(UITapGestureRecognizer*)recognizer {
    // Zoom out slightly, capping at the minimum zoom scale specified by the scroll view
    CGFloat newZoomScale = self.scrollView.zoomScale / 1.5f;
    newZoomScale = MAX(newZoomScale, self.scrollView.minimumZoomScale);
    [self.scrollView setZoomScale:newZoomScale animated:YES];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // Set a nice title
    self.title = @"Image";
    
    // Set up the image we want to scroll & zoom and add it to the scroll view
    UIImage *image = [UIImage imageNamed:@"photo1.png"];
    self.imageView = [[UIImageView alloc] initWithImage:image];
    self.imageView.frame = (CGRect){.origin=CGPointMake(0.0f, 0.0f), .size=image.size};
    [self.scrollView addSubview:self.imageView];
    
    // Tell the scroll view the size of the contents
    self.scrollView.contentSize = image.size;
    
    UITapGestureRecognizer *doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(scrollViewDoubleTapped:)];
    doubleTapRecognizer.numberOfTapsRequired = 2;
    doubleTapRecognizer.numberOfTouchesRequired = 1;
    [self.scrollView addGestureRecognizer:doubleTapRecognizer];
    
    UITapGestureRecognizer *twoFingerTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(scrollViewTwoFingerTapped:)];
    twoFingerTapRecognizer.numberOfTapsRequired = 1;
    twoFingerTapRecognizer.numberOfTouchesRequired = 2;
    [self.scrollView addGestureRecognizer:twoFingerTapRecognizer];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    // Set up the minimum & maximum zoom scales
    CGRect scrollViewFrame = self.scrollView.frame;
    CGFloat scaleWidth = scrollViewFrame.size.width / self.scrollView.contentSize.width;
    CGFloat scaleHeight = scrollViewFrame.size.height / self.scrollView.contentSize.height;
    CGFloat minScale = MIN(scaleWidth, scaleHeight);
    
    self.scrollView.minimumZoomScale = minScale;
    self.scrollView.maximumZoomScale = 1.0f;
    self.scrollView.zoomScale = minScale;
    
    [self centerScrollViewContents];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView
{    
    // Return the view that we want to zoom
    return self.imageView;
}

- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
    // The scroll view has zoomed, so we need to re-center the contents
    [self centerScrollViewContents];
}

@end

上記のコードは、チュートリアル プロジェクトのようには機能しません。次の UIScrollView デリゲート メソッド viewForZoomingInScrollView では、このエラーが発生します。

2013-05-14 10:01:18.585 TestScrollView[3809:907] できました

5 月 14 日 10:01:18 Scott-Laroses-iPhone TestScrollView[3809]: CGAffineTransformInvert: 特異行列。

5 月 14 日 10:01:18 Scott-Laroses-iPhone TestScrollView[3809]: CGAffineTransformInvert: 特異行列。

これは、チュートリアルとまったく同じように、そしてそれが機能しなかったときにプログラムでそれを行ったにもかかわらず、デレートが適切に設定されていないと思わせます。何か案は?

4

2 に答える 2

1

私はそれを考え出した!問題は、自動レイアウトの制約が画面外のビューを台無しにしていたことでした。そのため、自動レイアウトを無効にすると、正常に機能しました。

于 2013-05-17T16:50:35.963 に答える