サブビュー(写真)が追加されたUIScrollViewがあります。ユーザーがスクロールビューの画像に触れるたびに、その上にチェックマークが表示されます。
NSMutableIndexSet *picturesArray; <- .h で宣言
- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event {
if (!self.dragging) {
[self.nextResponder touchesEnded: touches withEvent:event];
NSLog(@"Touch down");
for (UITouch *touch in touches) {
for (int i = 1; i <= [self subviews].count; i++)
{
if(CGRectContainsPoint([[self viewWithTag:i]frame], [touch locationInView:self])){
NSLog(@"touched %d th view",i);
NSArray *subviews = [[self viewWithTag:i] subviews];
UIImageView *view = nil;
view = [subviews objectAtIndex:0];
if(view.hidden){
// add the index
[picturesArray addIndex:i];
view.hidden = NO; //check mark is shown
}else{
[picturesArray removeIndex:i];
view.hidden = YES; //check mark is not shown
}
// UIImageWriteToSavedPhotosAlbum([(UIImageView *)[self viewWithTag:i]image], nil, nil, nil); <- WORKS IF CALLED
}
}
}
}
質問 1: これはこれを行う最善の方法ですか? for (int i = 1; i <= [self subviews].count; i++) の使用はかなり遅いようです。基本的に、どのサブビューが触れられたかをキャプチャする必要があります。私は各サブビューを通過する以外にこれを理解していません
savePhotos が呼び出され、基本的にどの写真がタッチされたかを検索し、それらをフォト アルバムに保存します。ただし、UIImageWriteToSavedPhotosAlbum の呼び出しは失敗します。これは、TouchesEnded と同じファイルにあります。しかし、TouchesEnded で呼び出されると、機能します。
(IBAction) savePhotos: (id) 送信者{
NSLog(@"インデックス セットは %@ です",picturesArray );
const NSUInteger arrayCount = picturesArray.count;
NSUInteger *theIndexBuffer = (NSUInteger *)calloc(picturesArray.count, sizeof(NSUInteger)); UIImageWriteToSavedPhotosAlbum([(UIImageView *)[self viewWithTag:0]image], nil, nil, nil);
[picturesArray getIndexes:theIndexBuffer maxCount:arrayCount inIndexRange:nil];
for(int i = 0; i < arrayCount; i ++){
NSLog(@"Element is %d",theIndexBuffer[i]); UIImageWriteToSavedPhotosAlbum([(UIImageView *)[self viewWithTag:i]image], nil, nil, nil); <- THIS CRASHES
}
}
質問 2: UIImageWriteToSavedPhotosAlbum が失敗するのはなぜですか?