Функция UIButton не вызывается

Привет и заранее спасибо за вашу поддержку :)

Итак, что я делаю: 1. создаю представление прокрутки и добавляю его к основному представлению 2. затем в представление прокрутки добавляю еще один UIView размером с представление прокрутки; 3. и в UIView добавить программно созданную кнопку куда я тоже добавляю: тег, изображение, размер программно.

Порядок добавления (родительских) объектов: UIView->UIScrollView->UIView->UIButton

И вот код, который я использую:

#import "ViewController.h"

@interface ViewController ()
{
    UIButton *button;
    UIView *buttonHolderView;
}
@end

@implementation ViewController

@synthesize scroll;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //scroll view is added using storyboards
    [scroll setScrollEnabled:YES];
    [scroll setContentSize:CGSizeMake(1840, 1752)];
    scroll.bounces = NO;
    [scroll setBackgroundColor:[UIColor blackColor]];
    //UPDATE 4
    //here changed to integer coordinates and now it works
    buttonHolderView = [[UIView alloc] initWithFrame:CGRectMake( scroll.frame.origin.x, scroll.frame.origin.y, scroll.frame.size.width, scroll.frame.size.height)];
    [buttonHolderView setBackgroundColor:[UIColor blueColor]];
    [scroll addSubview:buttonHolderView];

    NSString *title = @"";
    int tagForTheButton = 0;

    button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.adjustsImageWhenHighlighted = NO;
    button.frame = CGRectMake(xPossition, yPossition, 200, 64);
    button.tag = tagForTheButton;
    [button setTitle:title forState:UIControlStateNormal];
    [button addTarget:self action:@selector(buttonPressed: ) forControlEvents:UIControlEventTouchUpInside];
    [buttonHolderView addSubview:button];
    [button setBackgroundImage:[UIImage imageNamed:[NSString stringWithFormat:@"Tile.png"]] forState:UIControlStateNormal];
    //other scroll and pinch gesture adjustments
    //UPDATE WITH CODE FOR PINCH AND SCROLL 


   [scroll setUserInteractionEnabled:YES];
    UIPinchGestureRecognizer *pitchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePitch:)];
    [scroll addGestureRecognizer:pitchGestureRecognizer];

    imageMaxScale = 1.1;
    imageMinScale = 0.2;
    imageCurrentScale = 1.0;



    yMyCharacterFrame = 200;
    xMyCharacterFrame = 200;
    myCharacterFrame = [[UIImageView alloc]init];
    myCharacterFrame.frame = CGRectMake(xMyCharacterFrame, yMyCharacterFrame, 100, 100);
    myCharacterFrame.image = [UIImage imageNamed:@"image0.png"];
    [myCharacterFrame setUserInteractionEnabled:YES];
    [scroll addSubview:myCharacterFrame];
}

-(void)handlePitch:(UIPinchGestureRecognizer *) pinchGesture{

    if (imageCurrentScale * [pinchGesture scale] > imageMinScale && imageCurrentScale * [pinchGesture scale] <imageMaxScale) {
        imageCurrentScale = imageCurrentScale * [pinchGesture scale];
        CGAffineTransform zoomTransform = CGAffineTransformMakeScale(imageCurrentScale, imageCurrentScale);
        [[pinchGesture view] setTransform:zoomTransform];
    }


    [pinchGesture setScale:1.0];
    CGRect scrollFrame;
    scrollFrame.origin = _mainViewHolder.frame.origin;
    scrollFrame.size = CGSizeMake(568, 320);
    scroll.frame = scrollFrame;

}

-(void)buttonPressed:(UIButton *)sender{
    NSLog(@"button pressed");   
}

Кнопка рисуется на экране, но когда я пытаюсь нажать на нее, она не входит в функцию buttonPressed (не NSLog).

Какие-либо предложения? Также я не понял, на что ссылается addTarget (я прочитал документацию Apple).

ОБНОВЛЕНИЕ 2: Если я добавлю кнопку в режим прокрутки, она не только отобразится, но и коснется ее.

ОБНОВЛЕНИЕ 3: Я ЗАПУСТИЛ: po [прокрутите рекурсивное описание]. Он вернулся:

UIScrollView: 0x7f95c9c7adf0; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7f95c9c7f5f0>; layer = <CALayer: 0x7f95c9c79820>; contentOffset: {0, 0}; contentSize: {1840, 1752}>
   | <UIImageView: 0x7f95c9c7ed40; frame = (317.5 561; 2.5 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x7f95c9c7ec20>>
   | <UIImageView: 0x7f95c9c7d2f0; frame = (313 565.5; 7 2.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x7f95c9c7dda0>>
   | <UIButton: 0x7f95c9d9f9c0; frame = (0 0; 320 568); opaque = NO; layer = <CALayer: 0x7f95c9d9e750>>
   |    | <UIButton: 0x7f95c9d9fea0; frame = (0 0; 200 64); opaque = NO; layer = <CALayer: 0x7f95c9d96540>>
|    |    | <UIImageView: 0x7f95c9cc4590; frame = (0 0; 200 64); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7f95c9cc4690>>

И:

(lldb) po [button recursiveDescription]
<UIButton: 0x7f95cd24e1f0; frame = (0 0; 200 64); opaque = NO; tag = 0; layer = <CALayer: 0x7f95cd24e100>>
   | <UIImageView: 0x7f95cd251b70; frame = (0 0; 200 64); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7f95cd251c70>>

ОБНОВЛЕНИЕ 4: После изменения кода на целочисленный код работает нормально: buttonHolderView = [[UIView alloc] initWithFrame:CGRectMake( прокрутки.frame.size.height)];

Спасибо за всю вашу помощь, особенно DoertyDoerk, который показал мне что-то совершенно новое.


person Bianca Ioana    schedule 11.01.2015    source источник
comment
Опция user Interaction Enabled отключена для прокрутки? Я попробовал ваш код, и он сработал.   -  person gabbler    schedule 11.01.2015
comment
Предложение 1: найдите любой супервизор кнопки с userInteractionEnabled установленным на NO.   -  person Jeffery Thomas    schedule 11.01.2015
comment
Предложение 2: в качестве теста удалите все распознаватели жестов. Они могут мешать событиям касания.   -  person Jeffery Thomas    schedule 11.01.2015
comment
установить кнопкуHolderView.userInteractionEnabled = true;   -  person Muhammad Adnan    schedule 11.01.2015
comment
Да, в моем коде это включено: [scroll setUserInteractionEnabled:YES]; и не работает..   -  person Bianca Ioana    schedule 11.01.2015
comment
но цель правильная?   -  person Bianca Ioana    schedule 11.01.2015
comment
также я включил взаимодействие для buttonHolderView и все еще ничего   -  person Bianca Ioana    schedule 11.01.2015


Ответы (2)


Ваш код для самой кнопки выглядит нормально. За исключением xPossition, бит yPossition скомпилирован хорошо, и вызывается buttonPressed:. Я подозреваю проблему с вашей иерархией представлений, как уже было предложено в предыдущих комментариях. Я бы установил точку останова в конце вашего метода `viewDidLoad:. Затем в перерыве в консоли введите следующую команду и проверьте, не перекрывается ли ваша кнопка.

po [[UIWindow keyWindow] recursiveDescription]

Вы можете скопировать и вставить результат в текстовый редактор для облегчения чтения.

Надеюсь, это поможет! введите здесь описание изображения

person DoertyDoerk    schedule 11.01.2015
comment
Я добавил скриншот к своему предыдущему ответу. Когда приложение достигает точки останова, просто скопируйте и вставьте команду, которую я указал вам, в окно консоли в правом нижнем углу экрана Xcode, как показано выше, и нажмите клавишу возврата. Вы также можете попытаться прерваться в конце -viewDidAppear, если результаты не являются окончательными. - person DoertyDoerk; 12.01.2015
comment
когда я пишу команду, она возвращает ноль в следующей строке, что ей делать? - person Bianca Ioana; 12.01.2015
comment
Я просто погуглил, и это кажется альтернативой Debug View Hierarchy, я попробую их оба, я что-то говорил об этом несколько месяцев назад, но я не знал, что это такое и как его использовать, спасибо за отправную точку - person Bianca Ioana; 12.01.2015
comment
У меня есть руны: (lldb) po [scroll recursiveDescription] - person Bianca Ioana; 12.01.2015
comment
Проверьте вторую трассировку, строку 2, где содержится информация о фоновом изображении. Здесь написано userInteractionEnabled = NO. Я бы установил ДА в -viewDidLoadили вообще избавился от него, по крайней мере, для тестирования. - person DoertyDoerk; 12.01.2015
comment
удалено фоновое изображение кнопки, но она по-прежнему не нажимается - person Bianca Ioana; 12.01.2015
comment
Вы также установили button.userInteractionEnabled = YES; ? - person DoertyDoerk; 12.01.2015
comment
Давайте продолжим обсуждение в чате. - person DoertyDoerk; 12.01.2015

Может быть, попробуйте это:

[buttonHolderView bringSubviewToFront:button];
person weso    schedule 11.01.2015
comment
Похоже на то, что Ты видишь меня, но не можешь дотронуться до меня. Кнопка видна, но, возможно, она находится в рамке меньшего размера. Пример: рамка с высотой 100 и кнопка с позицией 120 y вы ее видите, но не нажимаете. - person weso; 12.01.2015