iPhone: добавление кнопки в scrollview делает кнопку недоступной для взаимодействия - PullRequest
3 голосов
/ 01 марта 2010

По какой-то причине кнопка, инициализированная в методе addBook моего viewController, не реагирует на прикосновения. Селектор, который я ему назначил, никогда не срабатывает, и при нажатии на изображение изображение UIControlStateHighlighted никогда не появляется.

Есть ли что-то, что перехватывает прикосновения до того, как они попадают в UIButton, или его интерактивность как-то отключена тем, что я с ним делаю?

- (void)viewDidLoad {

    ...

    _scrollView.contentSize = CGSizeMake(currentPageSize.width, currentPageSize.height);
    _scrollView.showsHorizontalScrollIndicator = NO;
    _scrollView.showsVerticalScrollIndicator = NO;
    _scrollView.scrollsToTop = NO;
    _scrollView.pagingEnabled = YES;

    ...
}

- (void)addBook {
    // Make a view to anchor the UIButton
    CGRect frame = CGRectMake(0, 0, currentPageSize.width, currentPageSize.height);
    UIImageView* bookView = [[UIImageView alloc] initWithFrame:frame];

    // Make the button
    frame = CGRectMake(100, 50, 184, 157);
    UIButton* button = [[UIButton alloc] initWithFrame:frame];
    UIImage* bookImage = [UIImage imageNamed:kBookImage0];

    // THIS SECTION NOT WORKING!
    [button setBackgroundImage:bookImage forState:UIControlStateNormal];
    UIImage* bookHighlight = [UIImage imageNamed:kBookImage1];
    [button setBackgroundImage:bookHighlight forState:UIControlStateHighlighted];
    [button addTarget:self action:@selector(removeBook) forControlEvents:UIControlEventTouchUpInside];

    [bookView addSubview:button];   
    [button release];
    [bookView autorelease];

    // Add the new view/button combo to the scrollview.
    // THIS WORKS VISUALLY, BUT THE BUTTON IS UNRESPONSIVE :(
    [_scrollView addSubview:bookView];
}

- (void)removeBook {
    NSLog(@"in removeBook");
}

Иерархия представлений выглядит так в Интерфейсном Разработчике:

UIWindow
UINavigationController
    RootViewController
        UIView
            UIScrollView
            UIPageControl

и, по-видимому, так после запуска метода addBook:

UIWindow
UINavigationController
    RootViewController
        UIView
            UIScrollView
                UIView
                    UIButton
            UIPageControl

Ответы [ 2 ]

7 голосов
/ 01 марта 2010

UIScrollView может перехватывать все сенсорные события.

Возможно, попробуйте комбинацию из следующих:

_scrollView.delaysContentTouches = NO;
_scrollView.canCancelContentTouches = NO;

и

bookView.userInteractionEnabled = YES;
4 голосов
/ 01 марта 2010

попробуйте удалить [bookView autorelease]; и сделать это так:

// Add the new view/button combo to the scrollview.
// THIS WORKS VISUALLY, BUT THE BUTTON IS UNRESPONSIVE :(
[_scrollView addSubview:bookView];
[bookView release];

_scrollView.canCancelContentTouches = YES; должен сделать трюк

delaysContentTouches - это логическое значение, которое определяет, задерживает ли представление прокрутки обработку жестов касания. Если значение этого свойства - ДА, представление прокрутки задерживает обработку жеста касания до тех пор, пока оно не сможет определить, является ли целью прокрутка. Если значение равно NO, представление прокрутки немедленно вызывает touchesShouldBegin: withEvent: inContentView :. Значением по умолчанию является ДА.

canCancelContentTouches - это логическое значение, которое определяет, всегда ли касания в представлении содержимого приводят к отслеживанию. Если значением этого свойства является ДА, и представление в контенте начало отслеживать движение пальца к нему, и если пользователь перетаскивает палец, достаточный для запуска прокрутки, представление получает сообщение touchesCancelled: withEvent: и представление прокрутки обрабатывает коснуться как свиток. Если значение этого свойства равно NO, представление прокрутки не прокручивается независимо от движения пальца, когда представление содержимого начинает отслеживаться.

...