1

CGPoint の場所を使用すると、常に最後の画像が uiscrollview に保存されます。他の画像をタップして保存するとき。タップした正確な画像を保存するにはどうすればよいですか。

UIScrollView *imageScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
imageScrollView.pagingEnabled = YES;

NSInteger numberOfViews = 61;

for (int i = 0; i < numberOfViews; i++) {

    CGFloat xOrigin = i * self.view.frame.size.width;

 NSString *imageName = [NSString stringWithFormat:@"image%d.png", i];

    _image = [UIImage imageNamed:imageName];

    _imageView = [[UIImageView alloc] initWithImage:_image];

    _imageView.frame = CGRectMake(xOrigin, 0, self.view.frame.size.width, self.view.frame.size.height);

 UILongPressGestureRecognizer *gestureRecognizer = [[UILongPressGestureRecognizer alloc]
                                                       initWithTarget:self
                                                       action:@selector(handleLongPress:)];

    imageScrollView.userInteractionEnabled = YES;
    [imageScrollView addGestureRecognizer:gestureRecognizer];
    gestureRecognizer.delegate = self;
    [gestureRecognizer release];

    [imageScrollView addSubview:_imageView];
imageScrollView.contentSize = CGSizeMake(self.view.frame.size.width * numberOfViews, self.view.frame.size.height);

    - (void)handleLongPress:(UILongPressGestureRecognizer*)gestureRecognizer{
if (gestureRecognizer.state == UIGestureRecognizerStateBegan){
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Save Photo", nil];
    actionSheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent;
    [actionSheet showInView:self.view];
    [actionSheet release];

     }}

 -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {

switch (buttonIndex) {
    case 0:
        [self savePhoto];

       break;

    default:
        break;

}

   -(void)savePhoto{

CGPoint location = [gesture locationInView:_imageView];

if  (CGRectContainsPoint(_imageView.bounds, location)){

UIImageWriteToSavedPhotosAlbum(_image, self, @selector(image: didFinishSavingWithError:contextInfo:), nil);
   }}}

どんなアイデアでも大歓迎です。

ありがとう

4

1 に答える 1

1

UIScrollViewポイントは、LongPressGestureRecognizerがトリガーされる の境界内に常に表示されます。スクロール ビューcontentOffset (contentOffset.x水平レイアウトとcontentOffset.y垂直レイアウトに使用) をチェックして、保存する必要がある画像を検出する必要があります。

さらに、タッチ ポイントをインスタンスのローカル座標系に変換し、そのポイントがイメージ ビューのrectUIImageView内にあるかどうかを確認できます。bounds

アップデート

たとえば、このようなものを使用して、ポイントが画像ビューの境界内にあるかどうかを検出できます (注:これはテストしていません。これは、スクロール ビューに複数の画像ビューが追加されていることを前提としています)。

if (CGRectContainsPoint(_imageView.bounds, [self.view convertPoint:location toView:_imageView]))
{
    // do something
}

また、ユーザーに表示する前に、どの画像を保存する必要があるかを検出し、その画像への参照を保存することを検討する必要があります。これUIActionSheetにより、発生する可能性のある潜在的な問題の数が減り、後で読みやすくなる可能性がありますが、これは私の主観的な意見です.

于 2012-10-18T20:19:57.660 に答える