繁体   English   中英

如何从以编程方式创建的UIImageView中选择

[英]How do I segue from programmatically created UIImageView

我已经以编程方式创建了UIImage实例, UIImage实例随着imageArray计数的增加而增加,并且以编程方式将UIImage设置为它们。 由于这些UIImageView中不可见的故事板,我怎样才能从Segue公司UIViewController另一个UIViewController包含的一个实例UIImage显示详细图像。 当我的任何UIImageView被触摸时,如何选择另一个UIViewController

这是代码:

#import "FirstPageViewController.h"

@interface FirstPageViewController ()

@property (nonatomic, strong) UIImageView *imageView;
@property UIImage *image;
@property  NSArray *imgArray;;
@property NSMutableArray *imgNameArray;
@property UIView *containerView;
@property UIView *containerView2;

@end



@implementation FirstPageViewController

for (NSString *img in imgArray) {

    [imgNameArray addObject:img];
}

int Y = 0;
int X = 0;

    for (int i = 0; i<imgNameArray.count; i++) {

        NSString *imgName = imgNameArray[i];
        UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:imgName]];
        imageView.frame = CGRectMake(X, Y, 145, 109);
        imageView.layer.cornerRadius = 2;
        imageView.clipsToBounds = YES;

        [imageView.layer setBorderWidth:2];
        [imageView.layer setBorderColor:[[UIColor whiteColor]CGColor ]];
        if ((i%2)==0) {
            X = 154;
        }else {
            X = 0;
        }

        if ((i%2) ==0) {
            Y = i *  59;
        }
        [containerView addSubview:imageView];           
    }

[self.scrollView addSubview: containerView];

self.scrollView.contentSize = CGSizeMake(320, imgNameArray.count * 67);

无论您如何设置视图控制器,该控制器始终可以使用-performSegueWithIdentifier:sender:来选择另一个视图控制器。 因此,如果您已设置情节myDetailSegue以使标识为myDetailSegue的segue从图像阵列视图控制器通向图像细节视图控制器,则图像阵列控制器可以执行以下操作:

[self performSegueWithIdentifier:@"myDetailSegue" sender:self];

因此,处理任务的一种方法是在图像阵列控制器中创建一个动作:

-(IBAction)goToDetailController:(UIGestureRecognizer*)sender {
    // get the image view from the gesture recognizer
    UIImageView *tappedView = (UIImageView*)sender.view;
    // save the image from the image view
    self.detailImage = tappedView.image;
    // start the detail segue
    [self performSegueWithIdentifier:@"myDetailSegue" sender:self];
}

现在,您只需要在每个图像视图上附加一个手势识别器,即可将其目标设置为图像阵列视图控制器,并将操作设置为新的goToDetailController操作。 就像使用segues一样,您还需要-prepareForSegue:sender:方法。 该方法可以将细节视图控制器的图像设置为self.detailImage ,因为您明智地将其保存在了动作中。

您可以使用UICollectionView来显示图像。 每个单元格都有一个标识符(例如indexPathUITableview ),因此,对于每个要触摸的单元格,将使用此值并将其保留为图像的ID。 在连接的图像中搜索此ID,并将其加载到DetailViewController

UICollectionView具有一种检测已触摸哪个单元格的方法。

您可以使用Singleton共享imgNameArray变量。 并使用相同的“ ID”并将其发送到DetailViewController ,您可以加载引用的相同图像。

这是一种可能的解决方案。

将UITapGestureRecognizer添加到每个UIImageview中,并为每个Imageview定义唯一的标签(根据您的forloop)。

在手势识别器方法中,您可以通过

[(UIGestureRecognizer *)sender view].tag

使用此标签可以从阵列中获取垂直图像。 并执行Segue。

您可以在下面使用UIButton。

设置其BG图像,并标记每个按钮。

然后在其选择器中,检查标记以确定要传递的图像。

UIButton *btn = [[UIButton alloc] initWithFrame:BUTTON_RECT];
[btn setBackgroundImage:YOUR_IMAGES forState:UIControlStateNormal];
[btn addTarget:self action:@selector(handlePushEvent:) forControlEvents:UIControlEventTouchUpInside];
[btn setTag:i]; // you can set your defined tag here plus int i in your loop
.
.
.
[self.scrollView addSubview:btn];



- (void) handlePushEvent:(UIButton *)sender 
{
    // PERFORM SEGUE HERE or YOU CAN ALSO PUSH THE VC    

    int btnTag = sender.tag;
    for(int ctr=0; ctr<imgNameArray.count; ctr++)
    {
        if(ctr == btnTag) {

            NextViewController *nextVC = [[NextViewController alloc] initWithNibName:nil bundle:nil];
            nextVC.passedImage = imgNameArray[ctr];    // create a property in your next VC, then assign like this here
            [self.navigationController pushViewController:nextVC animated:YES];
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM