1

UIScrollViewをスクロールしようとすると、メインでExc_Bad_Accessエラーが発生します。このプログラムは簡単です。AppDelegateにUIViewControllerを追加しました。次に、ViewControllerのコードを示します。これはスクロールには問題なく機能しますが、追加するとすぐにtmpScrollView.delegate = self。プログラムはスクロールまたはズームせず、ズームしようとするとExc_Bad_Accessエラーが発生します。

@interface MainViewController : UIViewController &ltUIScrollViewDelegate>
@property (nonatomic,retain) UIScrollView *tmpScrollView;
@property (nonatomic,retain) UIView *containerView;
@end

- (void)viewDidLoad
{
[super viewDidLoad];

// Do any additional setup after loading the view.
tmpScrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];
tmpScrollView.delegate = self;
[self.view addSubview:tmpScrollView];

// Set up the container view to hold our custom view hierarchy
CGSize containerSize = CGSizeMake(640.0f, 640.0f);
self.containerView = [[UIView alloc] initWithFrame:(CGRect){.origin=CGPointMake(0.0f, 0.0f), .size=containerSize}];
[self.tmpScrollView addSubview:self.containerView];

// Set up custom view hierarchy
UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 640.0f, 80.0f)];
redView.backgroundColor = [UIColor redColor];
[self.containerView addSubview:redView];

UIView *blueView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 560.0f, 640.0f, 80.0f)];
blueView.backgroundColor = [UIColor blueColor];
[self.containerView addSubview:blueView];

UIView *greenView = [[UIView alloc] initWithFrame:CGRectMake(160.0f, 160.0f, 320.0f, 320.0f)];
greenView.backgroundColor = [UIColor greenColor];
[self.containerView addSubview:greenView];

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"slow.png"]];
imageView.center = CGPointMake(320.0f, 320.0f);
[self.containerView addSubview:imageView];

//Tell the scroll view the size of the contents
self.tmpScrollView.contentSize = containerSize;
}

-(void)viewWillAppear:(BOOL)animated
{
NSLog(@"Will Appear");
[super viewWillAppear:animated];

// Set up the minimum & maximum zoom scales
CGRect scrollViewFrame = self.tmpScrollView.frame;
CGFloat scaleWidth = scrollViewFrame.size.width / self.tmpScrollView.contentSize.width;
CGFloat scaleHeight = scrollViewFrame.size.height / self.tmpScrollView.contentSize.height;
CGFloat minScale = MIN(scaleWidth, scaleHeight);

self.tmpScrollView.minimumZoomScale = minScale;
self.tmpScrollView.maximumZoomScale = 1.0f;
self.tmpScrollView.zoomScale = minScale;

//***** Here is the line for setting the delegate
self.tmpScrollView.delegate = self;

[self centerScrollViewContents];
}


-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{
NSLog(@"End Zoom");
}

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

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

助けてくれてありがとう。これは私を1日夢中にさせています...

編集:centerScrollViewContensも追加します:

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

2 に答える 2

0

あなたが提供したコードは私の側ではうまく機能しています。「centerScrollViewContents」メソッドに何らかの問題がある可能性があります。このメソッドのコードも投稿できますか?

于 2012-06-19T04:52:37.017 に答える
0

スクロールビューの最小ズームスケールを計算する必要があります。ズームスケールが1の場合、コンテンツは通常のサイズで表示されます。1より下のズームスケールはズームアウトされたコンテンツを示し、1より大きいズームスケールはズームインされたコンテンツを示します。最小ズームスケールを取得するには、画像がぴったりと収まるようにズームアウトする必要がある距離を計算します。スクロールビューの幅に基づく境界。次に、画像の高さに基づいて同じことを行います。結果として得られる2つのズームスケールの最小値は、スクロールビューの最小ズームスケールになります。これにより、完全にズームアウトしたときに画像全体を表示できるズームスケールが得られます。

迅速:

let scrollViewFrame = scrollView.frame
let scaleWidth = scrollViewFrame.size.width / scrollView.contentSize.width
let scaleHeight = scrollViewFrame.size.height / scrollView.contentSize.height
let minScale = min(scaleWidth, scaleHeight);
scrollView.minimumZoomScale = minScale;

Objective-C

CGFloat scrollViewFrame = scrollView.frame
CGFloat scaleWidth = scrollViewFrame.size.width / scrollView.contentSize.width
CGFloat scaleHeight = scrollViewFrame.size.height / scrollView.contentSize.height
CGFloat minScale = min(scaleWidth, scaleHeight);
scrollView.minimumZoomScale = minScale;

他のプロジェクトやiOSで重いGPUを実行した個人的な経験(無限スクロール、最大ビットマップサイズなど)から、各デバイスに独自のしきい値があることに気付きました。過去のプロジェクトでは、クラッシュを防ぐために、以下の値をminimumZoomScaleとしてハードコーディングしました。

scale :
        {
                iPad : {
                    min : 0.8
                ,   max : 1.6
            }
            , iPhone : {
                    min : 0.25
                ,   max : 1.6
            }
            , iPhone6 : {
                    min : 0.3333
                ,   max : 1.6
            }
            , iPhoneResizable: {
                    min : 1
                ,   max : 1.6
            }
        }

初心者向けの優れたチュートリアル:http ://www.raywenderlich.com/76436/use-uiscrollview-scroll-zoom-content-swift

于 2014-11-21T01:08:43.213 に答える