gpt4 book ai didi

ios - 如何使表格滚动工作 : UIControl within UITableView within UIControl

转载 作者:行者123 更新时间:2023-12-01 19:04:50 25 4
gpt4 key购买 nike

这是设置:我在表格单元格中有 UIControls,允许从右向左滑动以实现删除功能(如清除)

表格单元格位于 UITableView 中。

TableView 位于另一个 UIControl 中,该 UIControl 允许从左向右或从右向左滑动以更改日期。发生这种情况时,会在主视图的右侧或左侧创建一个新的 TableView,然后从左侧或右侧拉入新的 TableView,直到达到阈值并且动画接管,然后用新的替换旧的。

在某些情况下,所有这些交互实际上都能正常工作。问题是经过几次交互(表格幻灯片似乎有问题)后,滚动表格变得困难/不可能。

这是 TableViewSlider(包含 TableView 的顶级 UIControl)的代码。任何想法将不胜感激!

 @implementation OSETableViewSlider


- (void) initialize {
self.backgroundColor = [UIColor backgroundFlatColor];
self.mainTableView = [self createUITableView];
self.mainTableView.frame = CGRectMake(0,0, self.frame.size.width, self.frame.size.height);
self.mainTableView.hidden = NO;
[self addSubview:self.mainTableView];
self.transitionInProgress = NO;
}

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self initialize];
}
return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if(self) {
[self initialize];
}
return self;
}

- (UITableView *)createUITableView {
UITableView *newTable = [[UITableView alloc] init];
newTable.hidden = YES;
newTable.separatorStyle = UITableViewCellSeparatorStyleNone;
newTable.scrollEnabled = YES;
newTable.bounces = YES;
newTable.dataSource = self;
newTable.delegate = self;
newTable.backgroundColor = [UIColor backgroundFlatColor];

return newTable;
}

- (void)setFrame:(CGRect)frame {
super.frame = frame;
self.mainTableView.frame = CGRectMake(0,0, frame.size.width, frame.size.height);
}

- (void)transitionToDate:(NSDate *)date fromRight:(BOOL)rightToLeft {
[self.viewController beginTransitionToDate:date];

self.transitionTableView = [self createUITableView];
self.transitionTableView.frame = CGRectMake( rightToLeft ? self.frame.size.width : (-1 * self.frame.size.width), 0,
self.frame.size.width, self.frame.size.height );
self.transitionTableView.hidden = NO;
[self addSubview:self.transitionTableView];

self.transitionInProgress = YES;

[UIView animateWithDuration:0.2f animations:^{
self.transitionTableView.frame = CGRectMake(0,0, self.frame.size.width, self.frame.size.height);

self.mainTableView.frame = CGRectMake( rightToLeft ? (-1 * self.frame.size.width) : self.frame.size.width, 0,
self.frame.size.width, self.frame.size.height);
} completion:^(BOOL completed){
[self.viewController endTransitionDidChange:YES];
[self.mainTableView removeFromSuperview];
self.mainTableView = self.transitionTableView;

self.transitionInProgress = NO;

}];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.viewController activityCountForTransition:(tableView!=self.mainTableView)];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
return [self.viewController cellNumber:indexPath.item forTransition:(tableView!=self.mainTableView)];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return [self.viewController cellNumber:indexPath.item forTransition:(tableView!=self.mainTableView)].frame.size.height;
}

- (void)layoutSubviews {
if(!self.transitionInProgress) {
[self.mainTableView setFrame:CGRectMake(0,0, self.frame.size.width, self.frame.size.height)];
}
}

- (BOOL) beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
NSLog(@"begin track");

self.locationInView = [touch locationInView:self.superview];
self.fingerTracking = YES;
self.fingerMoved = NO;
self.transitionTableView = nil;

return YES;
}

- (CGFloat) calcOffsetForTouch:(UITouch *)touch {
CGFloat fingerOffset = [touch locationInView:self.superview].x - self.locationInView.x;
return fingerOffset + self.startingOffset;
}

- (BOOL) continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
self.fingerMoved = YES;
CGFloat offset = [self calcOffsetForTouch:touch];

//NSLog(@"offset is: %f flarb: %f", offset, fabs(offset));

if(offset < 0 && (!self.transitioningLeft || [OSEUtils isNull:self.transitionTableView])) {
[self.viewController beginTransitionToDate:[OSEUtils daysOffset:1 fromDate:self.viewController.selectedDate withTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]]];
[self.transitionTableView removeFromSuperview];
self.transitionTableView = [self createUITableView];
self.transitioningLeft = YES;
NSLog(@"going left");
[self addSubview:self.transitionTableView];
[self.transitionTableView reloadData];
}
if(offset > 0 && (self.transitioningLeft || [OSEUtils isNull:self.transitionTableView])) {
[self.viewController beginTransitionToDate:[OSEUtils daysOffset:-1 fromDate:self.viewController.selectedDate withTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]]];
[self.transitionTableView removeFromSuperview];
self.transitionTableView = [self createUITableView];
self.transitioningLeft = NO;
NSLog(@"going right");
[self addSubview:self.transitionTableView];
[self.transitionTableView reloadData];
}

CGFloat mult = self.transitioningLeft ? 1 : -1;

if(fabs(offset) > (self.frame.size.width / 3.0f)) {
if(self.transitioningLeft) {
offset = -1 * self.frame.size.width;
} else {
offset = self.frame.size.width;
}

[UIView animateWithDuration:0.2f animations:^{
self.mainTableView.frame = CGRectMake(offset, 0, self.frame.size.width, self.frame.size.height);
self.transitionTableView.frame = CGRectMake(offset + (mult * self.frame.size.width), 0,
self.frame.size.width, self.frame.size.height);
} completion:^(BOOL finished) {
[self.mainTableView removeFromSuperview];

if(self.transitioningLeft) {
[self.viewController.daySelector jumpToNext];
} else {
[self.viewController.daySelector jumpToPrevious];
}

self.mainTableView = self.transitionTableView;
self.transitionTableView = nil;

[self.viewController endTransitionDidChange:YES];
}];

return NO;
}

self.mainTableView.frame = CGRectMake(offset, 0, self.frame.size.width, self.frame.size.height);
self.transitionTableView.frame = CGRectMake(offset + (mult * self.frame.size.width), 0, self.frame.size.width, self.frame.size.height);
self.transitionTableView.hidden = NO;

return YES;
}



- (void) endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
NSLog(@"end tableslide track");
[UIView animateWithDuration:0.2f animations:^{
self.mainTableView.frame = CGRectMake(0,0,self.frame.size.width, self.frame.size.height);
self.transitionTableView.frame = CGRectMake(((self.transitioningLeft ? 1 : -1 ) * self.frame.size.width), 0, self.frame.size.width, self.frame.size.height);
} completion:^(BOOL completion){
[self.transitionTableView removeFromSuperview];
self.transitionTableView = nil;
[self.viewController endTransitionDidChange:NO];
}];



self.fingerTracking = NO;
}


- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *tableHitTest = [self.mainTableView hitTest:point withEvent:event];
if([tableHitTest isKindOfClass:[OSECellPanelControl class]]) {
return tableHitTest;
} else {
return self;
}
}

@end

最佳答案

你为什么要创建一个新的 UITableView当用户向左或向右滑动时?使用内置的 deleteRowsAtIndexPath: 会更有效。和 insertRowsAtIndexPath:使行滑入和滑出动画的方法,而不必滑入和滑出整个UITableView的。

你可以看看at this for a reference在您跨日期滑动时为表格 View 内容更改设置动画。

我不知道您当前的设置,但是当我尝试使用可滑动的 UITableViewCell 进行完全相同的操作时的并且它的 super View 可以滑动,我在获得我想要的交互时遇到了问题。如果这导致您的问题,您可以查看检测用户滑动的位置。如果用户在 UITableViewCell 左右边缘的特定偏移量内滑动,则它会滑动单元格,该偏移量(单元格中心)之外的任何内容都会使 UITableView 本身滑动。然后,您将对新行的删除和插入进行动画处理。

此外,通过每次重新实例化一个新的 UITableView,您也迫使您的 UITableViewCell 每次都重新实例化。通过使用删除和插入方法,您可以通过 dequeueReusableCellWithIdentifier 继续使用现有单元格。方法。每次您重新实例化 UITableView 时,您的单元格都设置为 nil 并被丢弃,需要新的 tableview 来创建单元格的完整新实例。这是非常低效的。

关于ios - 如何使表格滚动工作 : UIControl within UITableView within UIControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20335412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com