如何在TTLauncherView中设置最大页数?

| 我将ѭ0用作我的应用程序的主屏幕,而我只有一页的图标。我该如何做才能使TTLauncherView不允许您将图标拖到“下一页”?我想设置最大页数(在这种情况下为一页)。 (编辑:长话短说,我把ѭ1归为一类,请参见下面的答案。) 我知道在调用ѭ1时为什么要在其中添加额外的页面,但是我不想编辑框架代码。 (这使得很难更新到较新的版本。)如果我不得不依赖于它的实现方式,我也宁愿不继承并重写该方法。 (我不反对子类化或添加类别,如果它是干净的。) 我尝试在ѭ5tried的回调方法
launcherViewDidBeginEditing
中将
scrollView.scrollEnabled
设置为NO,但是在编辑模式下这不起作用,我也不知道为什么。 我尝试通过设置
userInteractionEnabled=NO
在滚动视图中添加阻止程序UIView来拦截触摸事件,效果很好。我仍然必须以某种方式禁止将ѭ7拖到下一页。 我还尝试将滚动视图的ѭ8setting设置为
launcherViewDidBeginEditing
中的but9ѭ,但这似乎也不起作用。 有没有更好的办法? 尝试阻止手势:
- (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];
    }
}
    
已邀请:
我认为最好的选择是在
TTLauncherView
中超越your1ѭ。由于您实际上只会接触一种方法(该方法只有几行),因此在时间到时升级它应该不会太糟。由于该方法显式添加了额外的页面,因此我不确定如果不编辑该特定代码段该如何解决     
正如安德鲁·弗林(Andrew Flynn)在他的答案中所建议的那样,我能够通过继承并重写
beginEditing
方法来使其工作,以消除进入编辑模式时
TTLauncherView
添加的多余页面。 我遇到的一个问题是我无法弄清楚如何消除在子类上调用(私有)方法
updateContentSize
时收到的警告。我尝试将其强制转换为
id
,但这并没有消除警告。可能吗? 编辑:我可以使用
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];

    }
}
    

要回复问题请先登录注册