UIScrollView с большим количеством кнопок UIB - PullRequest
2 голосов
/ 21 сентября 2011

То, что я хочу, это UIView с большим количеством UIButtons в нем. Они размещаются и располагаются в соответствии с данными, хранящимися в NSArray. Поскольку кнопок достаточно много, они не помещаются на экране одновременно. Пользователь должен иметь возможность уменьшать масштаб, чтобы видеть все кнопки, или увеличивать масштаб, чтобы видеть детали (метку на них) и легко выбирать их.

Я пробовал два разных подхода:

1) Я создал подкласс UIView, поместил в него кнопки и экземпляр этого представления внутри UIScrollview.

Эффект: я могу получить доступ ко всем кнопкам через их теги, и прокрутка и масштабирование работают нормально. НО я не могу заставить кнопки обрабатывать какие-либо события (нажать на них) ...

2) Я написал UIViewController с точно такой же функциональностью и добавил его экземпляр в UIScrollView.

Эффект: теперь я могу нажимать кнопки, но прокрутка и масштабирование перестали работать.

Вот соответствующий код вида:

    - (UIView *)initWithArray:(NSArray *)nArray{
self = [super init];
if (self) {        
    int count = [nArray count];
    for (int i=0; i<count; i++) {
        UIButton *button = [[UIButton alloc]
                            initWithFrame:(__some Code to place the Button__);
        button.tag = i+1;
        NSString *title = [[NSString alloc] initWithFormat:__code for generating Title__];
        [button setTitle:title forState:UIControlStateNormal];
        button.titleLabel.font = [UIFont systemFontOfSize:14];
        [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown];
        [self addSubview:button];
    }
}
return self;

}

и код для матричного контроллера:

    - (void)viewDidLoad
    {
[super viewDidLoad];
    NSMutableArray *nArray = [[NSMutableArray alloc] __some code___];
int count = [nArray count];
for (int i=0; i<count; i++) {
    UIButton *button = [[UIButton alloc]
                        initWithFrame:CGRectMake(__some Code to place the Button__];
    button.tag = i+1;
    NSString *title = [[NSString alloc] initWithFormat:__code for generating Title__];
    [button setTitle:title forState:UIControlStateNormal];
    button.titleLabel.font = [UIFont systemFontOfSize:14];
    [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown];
    [self.view addSubview:button];
}

}

И код для ScrollViewController:

    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 768, 970)];
    [self.view addSubview:scrollView];
    [scrollView setBackgroundColor:[UIColor blackColor]];
    //Zooming
    [scrollView setMinimumZoomScale:0.25];
    [scrollView setMaximumZoomScale:4.0];
    [scrollView setDelegate:self];

    // constructing the view
    [scrollView addSubview:chartView];
    [scrollView bringSubviewToFront:chartView];

OR

    [scrollView addSubview:[matrixController view]];

Как мне заставить это работать ??

Ответы [ 2 ]

3 голосов
/ 21 сентября 2011

Я могу получить представление прокрутки, содержащее несколько кнопок для панорамирования и масштабирования, причем кнопки по-прежнему обрабатывают сенсорные события:

- (void)didTapButton:(UIButton *)button
{
    NSLog(@"Button %ld", (long)button.tag);
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
    scrollView.delegate = self;
    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * 3.0f, scrollView.frame.size.height * 3.0f);
    scrollView.maximumZoomScale = 3.0f;

    UIView *zoomView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, scrollView.contentSize.width, scrollView.contentSize.height)];
    zoomView.backgroundColor = [UIColor whiteColor];

    for (NSInteger index = 0; index < 100; index++)
    {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        button.frame = CGRectMake((scrollView.frame.size.width / 2.0f) - 50.0f, 10.0f + (50.0f * (CGFloat)index), 100.0f, 30.0f);
        button.tag = index;
        [button setTitle:[NSString stringWithFormat:@"Button %ld", ((long)index + 1)] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(didTapButton:) forControlEvents:UIControlEventTouchUpInside];

        [zoomView addSubview:button];
    }

    [scrollView addSubview:zoomView];
    [self.view addSubview:scrollView];
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return [scrollView.subviews objectAtIndex:0];
}

РЕДАКТИРОВАТЬ: я сказал не полагаться на тег в моемкомментарий ниже, пока я здесь делаю.:) Это просто для того, чтобы я мог записать номер кнопки, чтобы эта часть была проигнорирована.

0 голосов
/ 25 сентября 2014
for (int i=0; i<10; i++)
{
    UIButton  *scrollingbutton_outlet = [[UIButton alloc] init];
    scrollingbutton_outlet = [UIButton buttonWithType:UIButtonTypeCustom];
    UIImage *img = [UIImage imageNamed:@"box_normal.png"];
    scrollingbutton_outlet.frame = CGRectMake(0, 100, img.size.width, img.size.height);
     [scrollingbutton_outlet setTitle:[NSString stringWithFormat:@"%d",i+1] forState: UIControlStateNormal];
    scrollingbutton_outlet.tag=i+1;
    [buttonArray addObject:[NSString stringWithFormat:@"%d",i+1]];
    buttonArray = [[NSMutableArray alloc] init];
    [scrollingbutton_outlet setBackgroundImage:img forState:UIControlStateNormal];
    [scrollingbutton_outlet addTarget:self
                               action:@selector(scrollbuttonpress:)
                         forControlEvents:UIControlEventTouchUpInside];

    scrollingbutton_outlet.frame = CGRectMake(img.size.width*i,0, img.size.width,      scrollviewoutlet.frame.size.height);
    [scrollviewoutlet addSubview:scrollingbutton_outlet];
    width = scrollingbutton_outlet.frame.size.width;
    height = scrollingbutton_outlet.frame.size.height;
    scrollviewoutlet.contentSize = CGSizeMake(width*i+scrollingbutton_outlet.bounds.size.width+5, height);
}
...