0

contentOffset を使用して、タップされた画像オブジェクトを検出して保存しようとしていますが、代わりに常に最後の imageObject を保存します。

scrollViewでタップされた画像ビューのcontentOffsetを計算しようとする方法は次のとおりです。

(void)viewDidLoad

{
UIScrollView *imageScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
imageScrollView.delegate = self;
imageScrollView.pagingEnabled = YES;
for (int i = 0; i < 61; i++) {

    CGFloat xOrigin = i * 320;


    UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];

    [myButton addTarget:self action:@selector(dismissView:) forControlEvents:UIControlEventTouchUpInside];

    myButton.frame = CGRectMake(xOrigin, 10, 60, 35);


    [myButton.layer setMasksToBounds:YES];

    [myButton.layer setCornerRadius:10.0f];

    myButton.layer.borderWidth = 2;

    myButton.layer.borderColor = [[UIColor whiteColor] CGColor];

    [myButton setTitle:@"Done" forState:UIControlStateNormal];

    myButton.backgroundColor = [UIColor clearColor];

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

UIImage *image = [UIImage imageNamed:imageName];

    _imageView = [[[UIImageView alloc] initWithImage:image]autorelease]; 
     _imageView.frame = CGRectMake(xOrigin, 0, 320, 480);

    _imageView.tag = i;

    [_imageScrollView viewWithTag:i+1];

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

    imageScrollView.userInteractionEnabled = YES;

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

    [imageScrollView addSubview:_imageView];

    [imageScrollView addSubview:myButton];


}

imageScrollView.contentSize = CGSizeMake(320 * 61 , 480);


[self.view addSubview:imageScrollView];

  }

 - (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 performSelector:@selector(LongPress:) withObject:nil];

       break;

    default:
        break;

}}

- (void)LongPress:(UILongPressGestureRecognizer*)gestureRecognizer{

CGPoint offset = _imageScrollView.contentOffset;

int imageView = floor((Offset.x - imageView / 320) / imageView) + 1;
UIImage* image = [(UIImageView*)[_imageScrollView viewWithTag:imageView] image];

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

このコードはタップされた画像を保存すると思っていましたが、代わりにスクロールビューから最後の画像ビューを保存します。

やり方が間違っている場合や、まだ何か不足している場合はお知らせください。助けてくれてありがとう。

4

2 に答える 2

1
  int imageView = floor((Offset.x - imageView / 320) / imageView) + 1;

この行で

 int imageView = (int)(scrollView.contentOffset.x / scrollView.frame.size.width);
于 2012-10-21T17:16:57.510 に答える
1

理由はviewDidLoadあなたが使用しているあなたにあります

_image = [UIImage imageNamed:imageName];

これはクラスのグローバル変数だと思います。このオブジェクトを使用して画像をフォト アルバムに保存しています。ループの画像の最後のカウントのグローバル変数であるため、それを指すため、常に最後の画像が保存されます。

_imageforループ内でローカルにすることで修正できます。タグを設定していると、タグを使用して、scrollView から imageView/image を取得できます。あなたはこのようにすることができます

//your imageView in longPress function has the selected imageView's tag
UIImage* selImage = [(UIImageView*)[imageScrollView viewWithTag:imageView] image];

これはうまくいくはずです。

于 2012-10-21T16:48:08.273 に答える