我正在使用TTLauncherView
作为我的应用程序的主屏幕,我只有一页的图标。我怎样才能使TTLauncherView不会让你将图标拖到“下一页”?我想设置最大页数(在这种情况下为1)。
(编辑: 长话短说,我已经分组beginEditing
,请参阅下面的答案。 )
我看到为什么在调用beginEditing
时添加额外页面的原因,但我不想编辑框架代码。 (这使得很难更新到更新的版本。)如果我不得不依赖它的实现方式,我也不想继承和覆盖那个方法。 (我不反对继承或添加类别,如果它是干净的。)
我尝试在我scrollView.scrollEnabled
的回调方法launcherViewDidBeginEditing
中将TTLauncherViewDelegate
设置为NO,但是当它处于编辑模式时我不知道为什么。< / p>
我尝试在滚动视图中添加阻止程序UIView,通过设置userInteractionEnabled=NO
来拦截触摸事件,这可以正常工作。我仍然必须以某种方式禁用TTLauncherItems
到下一页的拖动。
我还尝试在contentSize
中将scrollview的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];
}
}
答案 0 :(得分:2)
我认为在beginEditing
覆盖TTLauncherView
是最好的选择。因为你只是真正触摸一种方法(并且在该方法中只有几行),所以在时机成熟时进行升级不应该太糟糕。由于该方法明确添加了额外的页面,我不确定如何编辑特定的代码片段
答案 1 :(得分:0)
正如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];
}
}