3

Any.DO アプリのコピーを作成しようとしています。はtableHeaderView"NewTaskCell" ビューで、 と が含まれていUITextFieldます。何らかの理由で、キーボードが表示された後、tableView を一番下までスクロールできません。これが私が試したことです:

  1. tableView のフレームを変更する
  2. tableView の境界を変更する
  3. tableView の contentSize の変更
  4. キーボードを閉じた後のフッター ビューの更新

キーボードが表示された場合にのみ発生するため、キーボードまたはテキストフィールドのいずれかと関係がある必要があります。

下のアニメーションでは、プラス ボタンをクリックしてキーボードを表示すると、tableView が一番下までスクロールできないことがわかります。その後、プラスボタンをクリックしてキーボードを表示しないと、下までスクロールできます。

プロジェクト全体のソース コードは次のとおりです。

これが私の viewDidLoad メソッドの内容です。

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[self tableView] setAllowsSelection: YES];
    [[self tableView] setShowsVerticalScrollIndicator: NO];

    // Make sure there aren't any empty cells showing at the bottom
    // Caused initial error [[self tableView] setTableFooterView: [UIView new]];

    // Fixes error at first, until the keyboard shows up
    UIView *footer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 45)];
footer.backgroundColor = [UIColor clearColor];
self.tableView.tableFooterView = footer;

    // Make the separators look right
    [[self tableView] setSeparatorStyle: UITableViewCellSeparatorStyleSingleLine];
    [[self tableView] setSeparatorColor: [UIColor colorWithWhite: 0.95 alpha: 1]];

    UINib *nibTwo = [UINib nibWithNibName: @"TaskCell" bundle: nil];
    [[self tableView] registerNib: nibTwo forCellReuseIdentifier: @"TaskCell"];

    // Create the new task cell to go above the tableView
    // --------------------------------------------------
    NewTaskCell *myNewTaskCell = [[NewTaskCell alloc] init];

    // Need to access it later to show the keyboard
    [self setTheNewTaskCell: myNewTaskCell];

    [[theNewTaskCell view] setFrame: CGRectMake(0, 0, 320, 44)];
    [[[theNewTaskCell reminderButton] layer] setOpacity: 0];
    [[[theNewTaskCell locationButton] layer] setOpacity: 0];
    [[[theNewTaskCell addTaskButton] layer] setOpacity: 0];

    // Assign a method for each button
    [[theNewTaskCell reminderButton] addTarget:self action:@selector(addReminder)     forControlEvents: UIControlEventTouchUpInside];
    [[theNewTaskCell locationButton] addTarget:self action:@selector(addLocationReminder) forControlEvents: UIControlEventTouchUpInside];
    [[theNewTaskCell addTaskButton] addTarget:self action:@selector(addTaskToList) forControlEvents: UIControlEventTouchUpInside];

    // Separator view
    UIView *separatorView = [[UIView alloc] initWithFrame: CGRectMake(0, 43, 320, 1)];
    [separatorView setBackgroundColor: [UIColor colorWithWhite: 0.5 alpha: 0.2]];
    [[theNewTaskCell view] addSubview: separatorView];

    [[self tableView] setTableHeaderView: [theNewTaskCell view]];
    [[self tableView] setContentInset: UIEdgeInsetsMake(-44, 0, 0, 0)];
    // ---------------------------------------------------
    // For Reordering
    [[self tableView] setEditing: YES];

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget: self action: @selector(longPress:)];
    [longPress setMinimumPressDuration: 0.3];
    [longPress setDelaysTouchesBegan: YES];

    [self setLongPressGesture: longPress];
    [[self tableView] addGestureRecognizer: longPress];
}

+ボタンクリック時のコード

-(void)makeNewTask
{
    // Create the fromPosition and toPosition of the label animation
    CGRect fromPosition;
    CGRect toPosition = CGRectMake(todayDayLabel.frame.origin.x +     todayDayLabel.superview.frame.origin.x, todayDayLabel.frame.origin.y + todayDayLabel.superview.frame.origin.y, todayDayLabel.frame.size.width, todayDayLabel.frame.size.height);

    if ([self dayType] == TaskDayTypeToday)
        fromPosition = toPosition;
    else if ([self dayType] == TaskDayTypeTomorrow)
        fromPosition = CGRectMake(tomorrowDayLabel.frame.origin.x + tomorrowDayLabel.superview.frame.origin.x, tomorrowDayLabel.frame.origin.y + tomorrowDayLabel.superview.frame.origin.y, tomorrowDayLabel.frame.size.width, tomorrowDayLabel.frame.size.height);
    else if ([self dayType] == TaskDayTypeUpcoming)
        fromPosition = CGRectMake(upcomingDayLabel.frame.origin.x + upcomingDayLabel.superview.frame.origin.x, upcomingDayLabel.frame.origin.y + upcomingDayLabel.superview.frame.origin.y, upcomingDayLabel.frame.size.width, upcomingDayLabel.frame.size.height);
    else
        fromPosition = CGRectMake(somedayDayLabel.frame.origin.x + somedayDayLabel.superview.frame.origin.x, somedayDayLabel.frame.origin.y + somedayDayLabel.superview.frame.origin.y, somedayDayLabel.frame.size.width, somedayDayLabel.frame.size.height);
    // -------------------------------------------------------------

    isLoading = YES;

    [[self tableView] reloadData];

    // Make sure the scroller doesn't show up on the side
    [[self tableView] setShowsVerticalScrollIndicator: NO];

    // Create the label and animate it -------------------------
    UILabel *lbl = [[[[[NSBundle mainBundle] loadNibNamed: @"DayCell" owner: self options:nil] objectAtIndex: 0] subviews] objectAtIndex: 0];

    if ([self dayType] == TaskDayTypeToday)
        [lbl setText: @"TODAY"];
    if ([self dayType] == TaskDayTypeTomorrow)
        [lbl setText: @"TOMORROW"];
    if ([self dayType] == TaskDayTypeUpcoming)
        [lbl setText: @"UPCOMING"];
    if ([self dayType] == TaskDayTypeSomeday)
        [lbl setText: @"SOMEDAY"];

    [self setTheDayLabel: lbl];
    [theDayLabel setFrame: fromPosition];

    [theDayLabel setTranslatesAutoresizingMaskIntoConstraints: YES];
    [[self tableView] addSubview: theDayLabel];

    // animate it moving to the right position
    if (!animateContentInset) {
        [[self tableView] setContentInset: UIEdgeInsetsMake(0, 0, 0, 0)];
        [[self tableView] setScrollEnabled: NO];
    }
    else {
        [UIView animateWithDuration: 0.4 delay: 0 options: UIViewAnimationOptionCurveEaseOut animations: ^{
            [[self tableView] setContentInset: UIEdgeInsetsMake(0, 0, 0, 0)];
            [theDayLabel setFrame: toPosition];
        } completion: ^(BOOL done){
            [[self tableView] setScrollEnabled: NO];
        }];
    }
    // ----------------------------------------------------------
    // Create the UIButton to get back to the tableView
    UIButton *backToTableView = [UIButton buttonWithType: UIButtonTypeCustom];
    [backToTableView setFrame: CGRectMake(1, 45, 320, 480)];
    [backToTableView addTarget: self action: @selector(showTableView) forControlEvents: UIControlEventTouchUpInside];

    [[self tableView] addSubview: backToTableView];

    // Show the keyboard
    [[theNewTaskCell theNewTaskTextField] setDelegate: self];
    //[[theNewTaskCell theNewTaskTextField] becomeFirstResponder];
}

backToTableView ボタンのコード

-(void)showTableView
{
    [theDayLabel setHidden: YES];

    [[self tableView] setScrollEnabled: YES];

    [UIView animateWithDuration: 0.4 animations:^{
        // self.tableView.contentInset = UIEdgeInsetsZero;
        [[self tableView] setContentInset: UIEdgeInsetsMake(-REFRESH_HEADER_HEIGHT, 0, 0, 0)];

        // Get the newTaskCell view, then get the textfield from that view
        [[theNewTaskCell theNewTaskTextField] setText: @""];
        [[theNewTaskCell addTaskButton] setAlpha: 0];
        [[theNewTaskCell reminderButton] setAlpha: 0];
        [[theNewTaskCell locationButton] setAlpha: 0];

        [[theNewTaskCell theNewTaskTextField] resignFirstResponder];

        // Remove the button to go back to the tableView
        for (UIView *v in [[self tableView] subviews]) {
            if (v.frame.origin.x == 1)
                [v removeFromSuperview];
        }

        isLoading = NO;

        [[self tableView] reloadData];
    }];
}

問題は次のようになります。

問題

4

7 に答える 7

2

UITableView がステータス バーによって 20px オフセットされているようです。UITableView の高さを 20px 減らす必要があります。修正されます。

于 2013-04-26T15:14:51.743 に答える
1

このコードを showTableView メソッドに追加することで問題を解決しました。

[[self tableView] setContentInset: UIEdgeInsetsMake(REFRESH_HEADER_HEIGHT, 0, 0, 0)];
[[self tableView] setContentInset: UIEdgeInsetsMake(0, 0, 0, 0)];
于 2013-04-27T02:41:55.843 に答える
0

そのオフセットが問題である場合-そのViewControllerだけでなく、アプリケーション全体をフルスクリーンにして解決する1つのオプション。

この質問はどのように答えますか -これは iPad アプリを全画面表示にする正しい方法ですか?

于 2013-04-26T16:40:48.513 に答える
0

将来的には、iOS7で同様の問題を経験した人は誰でもこのようなことを行うことができます

 [[self tableView] setContentInset: UIEdgeInsetsMake(0, 0, self.bottomLayoutGuide.length, 0)];

topLayoutGuidebottomLayoutGuide自動レイアウトの一部でありlength、両方で利用でき、その優れた機能です。

于 2014-04-30T15:36:56.503 に答える