多数のボタンを備えたポップアップ メニューを実装する必要があります。ポップアップを作成し、ボタンを動的に追加しました。ここで、iPhone のホーム画面のようにボタンを再配置する必要があります。長押しジェスチャが発生すると、ボタンは閉じるボタンでアニメーション化を開始する必要があります (電話からアプリを削除しようとしたときに表示されるような)。さらに、ボタンをドラッグして、ボタンの位置を再配置する必要があります。ボタンの外観と閉じるボタンにアニメーションを追加しましたが、ボタンの位置を再配置する方法を見つけるのに苦労しています。私はよく検索し、この機能に関する多くのリンクを見つけましたが、それらのほとんどはかなり長くて複雑です. すばやく実装できる、すばやく簡単なものが欲しいだけです。アイデアはありますか??
4 に答える
私は多くのライブラリを試し、優れた実用的なソリューションであるUzysGridViewを発見しました。
これは非常にシンプルで、カスタマイズが容易です。
私は同じ問題を抱えており、次のコードで問題を解決しました。
1) ドキュメント フォルダからすべての画像を取得します
。2) スクロールビューに設定します
。3) UILongPressGestureRecognizer を Imageview に配置します。十字ボタンを表示します。
4) 削除された場合は、手順 2 から 4 を繰り返します。
アイテム全体を配置する必要はありませんが、スクロールビューからすべてのアイテムを削除して、再度補充するだけです。
//Document Directory
#define kAppDirectoryPath NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)
#pragma mark - File Functions - Document/Cache Directory Functions
- (void)createDocumentDirectory:(NSString*)pStrDirectoryName
{
NSString *dataPath = [self getDocumentDirectoryPath:pStrDirectoryName];
if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
[[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:NULL];
}
- (NSString*)getDocumentDirectoryPath:(NSString*)pStrPathName
{
NSString *strPath = @"";
if(pStrPathName)
strPath = [[kAppDirectoryPath objectAtIndex:0] stringByAppendingPathComponent:pStrPathName];
return strPath;
}
-(void)setScrollviewItem {
NSArray* subviews = [[NSArray alloc] initWithArray: scrollObj.subviews];
for (UIView* view in subviews) {
if ([view isKindOfClass:[UIImageView class]]) {
[view removeFromSuperview];
}
if ([view isKindOfClass:[UIButton class]]) {
[view removeFromSuperview];
}
}
[subviews release];
[arrSaveImage removeAllObjects];
NSError *error = nil;
NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[slef getDocumentDirectoryPath:@"MyPhotos"] error:&error];// MyPhoto is my Directory Name.
if (!error) {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self ENDSWITH '.png'"];
NSArray *imagesOnly = [dirContents filteredArrayUsingPredicate:predicate];
for (int i=0;i<[imagesOnly count]; i++) {
[arrSaveImage addObject:[imagesOnly objectAtIndex:i]];
}
}
int px=0;
for (int i = 0; i < [arrSaveImage count]; i++) {
UIImageView *imgBackScroll=[[UIImageView alloc] init];
NSString *strPath=[self getDocumentDirectoryPath:@"MyPhotos"];
strPath=[NSString stringWithFormat:@"%@/%@",strPath,[arrSaveImage objectAtIndex:i]];
imgBackScroll.image=[UIImage imageWithData:[NSData dataWithContentsOfFile:strPath]];
imgBackScroll.frame=CGRectMake(px+5, 10, 90, 80);
imgBackScroll.layer.cornerRadius = 5.0;
imgBackScroll.layer.masksToBounds = YES;
imgBackScroll.tag=i;
imgBackScroll.userInteractionEnabled = YES;
[scrollObj addSubview:imgBackScroll];
UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];//This is your Cross delete button on corner
//[btn setTitle:@"-" forState:UIControlStateNormal];
[btn setImage:[UIImage imageNamed:@"CrossDelete.png"] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(deleteButton:) forControlEvents:UIControlEventTouchUpInside];
btn.frame=CGRectMake(imgBackScroll.frame.origin.x-2, 0, 15, 15);
btn.hidden=YES;
btn.tag=i;
[scrollObj addSubview:btn];
UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(startWobbling:)];
longPressGesture.view.tag=i;
[imgBackScroll addGestureRecognizer:longPressGesture];
[imgBackScroll release];
[longPressGesture release];
px=px+95;
}
scrollObj.contentSize = CGSizeMake(px, scrollObj.frame.size.height);
}
-(void) startWobbling:(UILongPressGestureRecognizer*)gesture{
CGAffineTransform leftWobble = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(-5.0));
CGAffineTransform rightWobble = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(5.0));
gesture.view.transform = leftWobble; // starting point
[UIView beginAnimations:@"wobble" context:gesture.view];
[UIView setAnimationRepeatAutoreverses:YES]; // important
[UIView setAnimationRepeatCount:11];
[UIView setAnimationDuration:0.25];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(wobbleEnded:finished:context:)];
gesture.view.transform = rightWobble; // end here & auto-reverse
[UIView commitAnimations];
NSArray* subviews = [[NSArray alloc] initWithArray: scrollObj.subviews];
for (UIView* view in subviews) {
if ([view isKindOfClass:[UIButton class]]) {
if (view.tag==gesture.view.tag) {
view.hidden=NO;
}
}
}
[subviews release];
}
//When Delete button pressed
-(IBAction)deleteButton:(id)sender {
UIButton *bt=(UIButton *)sender;
self.strDeleteFilePath=[FunctionManager getDocumentDirectoryPath:@"MyPhotos"];
self.strDeleteFilePath=[NSString stringWithFormat:@"%@/%@",strDeleteFilePath,[arrSaveImage objectAtIndex:bt.tag]];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"Are you sure you want to delete this photo" delegate:self cancelButtonTitle:@"Delete" otherButtonTitles:@"Cancel", nil];
[alert show];
[alert release];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
if (buttonIndex == 0){
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error = nil;
if(![fileManager removeItemAtPath:self.strDeleteFilePath error:&error]) {
NSLog(@"Delete failed:%@", error);
} else {
NSLog(@"image removed: %@",strDeleteFilePath);
}
[self setScrollviewItem];
}
}
これらのサンプルコードをチェックしてください。
https://github.com/gmoledina/GMGridView
http://mobile.tutsplus.com/tutorials/iphone/uicollectionview-layouts/
これらのサンプルコードがあなたのニーズを満たすことを願っています..
UICollectionView はそれをより効率的に行います。
UICollectionView を使用したくない場合は、UIScrollView をサブクラス化し、layoutSubview メソッドをオーバーライドしてみてください。ボタンを再配置する必要があるときはいつでも、setNeedsLayout を呼び出します。
例(テストしていません):
- (void)layoutSubviews
{
[super layoutSubviews];
CGFloat x = 0;
CGFloat y = 0;
CGFloat buttonWidth = 100;
CGFloat buttonHeight = 100;
CGFloat spaceBetweenButtons = 10;
for (UIButton *button in self.subviews)
{
if ([button isKindOfClass:[UIButton class]])
{
button.frame = CGRectMake(x, y, buttonWidth, buttonHeight);
x+=buttonWidth+spaceBetweenButtons;
if (x + buttonWidth > self.frame.size.width)
{
x = 0;
y += spaceBetweenButtons+ buttonHeight;
}
}
}
self.contentSize = CGPointMake(0, y);
}
- (void)rearrange
{
[UIView animateWithDuration:0.2 animations:^{
[self setNeedsLayout];
}];
}