Как я могу установить максимальное количество страниц в TTLauncherView? - PullRequest
0 голосов
/ 15 апреля 2011

Я использую TTLauncherView как своего рода домашний экран для своего приложения, и у меня есть только значки на одну страницу.Как я могу сделать так, чтобы TTLauncherView не позволял вам перетаскивать иконки на «следующую страницу»?Я хочу установить максимальное количество страниц (в данном случае - одну).

(РЕДАКТИРОВАТЬ: Короче говоря, я подкласс beginEditing, см. Ответ ниже. )

Я понимаю, почему он добавляет дополнительную страницу при вызове beginEditing, но я не хочу редактировать код фреймворка.(Это затрудняет обновление до более новых версий.) Я также предпочел бы не создавать подклассы и не переопределять этот один метод, если мне придется полагаться на то, как он реализован.(Я не против подклассов или добавления категории, если она чистая.)

Я попытался установить scrollView.scrollEnabled в NO в методе обратного вызова launcherViewDidBeginEditing в моем TTLauncherViewDelegate, но это не работает, покаон находится в режиме редактирования, и я не знаю, почему.

Я попытался добавить блокировщик UIView в представление прокрутки для перехвата сенсорных событий, установив userInteractionEnabled=NO, который работает нормально.Мне все еще нужно как-то отключить перетаскивание TTLauncherItems на следующую страницу.

Я также пытался установить contentSize для просмотра прокрутки на bounds в launcherViewDidBeginEditing, но это не выгляделоработать либо.

Есть ли лучший способ?

Пытался заблокировать жесты:

- (void)setLauncherViewScrollEnabled:(BOOL)scrollEnabled {
        if (scrollEnabled) {
            [self.scrollViewTouchInterceptor removeFromSuperview];
            self.scrollViewTouchInterceptor = nil;
        } else {
            // iter through the kids to get the scrollview, put a gesturerecognizer view in front of it
            UIScrollView *scrollView = [launcherView scrollViewSubview];
            self.scrollViewTouchInterceptor = [UIView viewWithFrame:scrollView.bounds]; // property retains it
            UIView *blocker = self.scrollViewTouchInterceptor;
            [scrollView addSubview:scrollViewTouchInterceptor];
            [scrollView sendSubviewToBack:scrollViewTouchInterceptor];
            scrollViewTouchInterceptor.userInteractionEnabled = NO;
        }
    }

Для справки: TTLauncherView.m :

- (void)beginEditing {
    _editing = YES;
    _scrollView.delaysContentTouches = YES;

    UIView* prompt = [self viewWithTag:kPromptTag];
    [prompt removeFromSuperview];

    for (NSArray* buttonPage in _buttons) {
        for (TTLauncherButton* button in buttonPage) {
            button.editing = YES;
            [button.closeButton addTarget:self action:@selector(closeButtonTouchedUpInside:)
                         forControlEvents:UIControlEventTouchUpInside];
        }
    }

    // Add a page at the end
    [_pages addObject:[NSMutableArray array]];
    [_buttons addObject:[NSMutableArray array]];
    [self updateContentSize:_pages.count];

    [self wobble];

    if ([_delegate respondsToSelector:@selector(launcherViewDidBeginEditing:)]) {
        [_delegate launcherViewDidBeginEditing:self];
    }
}

Ответы [ 2 ]

2 голосов
/ 15 апреля 2011

Я думаю, что переопределение beginEditing в TTLauncherView - ваш лучший выбор.Поскольку вы действительно касаетесь только одного метода (и только нескольких строк в этом методе), его обновление, когда придет время, не должно быть слишком плохим.Поскольку этот метод явно добавляет дополнительную страницу, я не уверен, как вы обойдете ее без редактирования этого конкретного фрагмента кода

0 голосов
/ 15 апреля 2011

Как предложил Эндрю Флинн в своем ответе, я смог заставить его работать, создав подкласс и переопределив метод beginEditing для удаления дополнительной страницы, которую добавляет TTLauncherView, когда она переходит в режим редактирования.

Одна проблема, с которой я сталкиваюсь, заключается в том, что я не могу понять, как удалить предупреждение, которое я получаю при вызове (частного) метода updateContentSize в моем подклассе. Я попытался привести его к id, но это не сняло предупреждение. Возможно ли это?

edit : я смог удалить предупреждение, используя performSelector для отправки сообщения в закрытый класс. (Ранее я создавал метод категории performSelector:withInt, который упаковывает NSInvocation, чтобы я мог передавать примитивы с помощью performSelector методов, что делает это очень удобным.)

// MyLauncherView.h
@interface MyLauncherView : TTLauncherView {
    NSInteger _maxPages;
}

@property (nonatomic) NSInteger maxPages;

@end




// MyLauncherView.m
@implementation MyLauncherView
@synthesize maxPages = _maxPages;

- (void)beginEditing {
    [super beginEditing];

    // ignore unset or negative number of pages
    if (self.maxPages <= 0) {
        return;
    }

    // if we've got the max number of pages, remove the extra "new page" that is added in [super beginEditing]
    if ([_pages count] >= self.maxPages ) {
        [_pages removeLastObject];

        [self updateContentSize:_pages.count];   // this has a compiler warning

        // I added this method to NSObject via a category so I can pass primitives with performSelector
        // [self performSelector:@selector(updateContentSize:) withInt:_pages.count waitUntilDone:NO];

    }
}
...