简体   繁体   中英

iOS UITableView - UISlider in only section header is reset when scrolling

I have a UISlider in a section header. Sliding the slider will change the current table cell, as a sort of "speed scroll" mechanism.

It works great, BUT when it hits the item in the middle of the screen (item #7), a hiccup occurs (I assume when it's re-centering the selected list item) and causing the UISlider to reset to the minimum.

Here's the relevant code in the View Controller:

//
//  ChapterSelectionView.m
//  TestApp
//
//  Created by Darren Ehlers on 6/2/11.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "ChapterSelectionView.h"
#import "ContentView.h"

@implementation ChapterSelectionView

@synthesize initSection;
@synthesize initRow;
@synthesize Book;
@synthesize Chapter;

@synthesize backButton;
@synthesize contentView;
@synthesize chapterList;
@synthesize navBar;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
    {
        // Custom initialization
    }
    return self;
}

- (void)dealloc
{
    [slider release];

    [super dealloc];
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn"t have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren"t in use.
}

- (void) updateLabel:(id)sender
{
    NSLog(@"slider.value=%f (%d)", slider.value, (int)(slider.value + 0.5));
    self.Chapter       = (int)(slider.value + 0.5);
    navBar.topItem.title    = [NSString stringWithFormat:@"%@ %d", self.Book.name, self.Chapter];

    [chapterList selectRowAtIndexPath:[NSIndexPath indexPathForRow:(self.Chapter - 1) inSection:0] animated:YES scrollPosition:UITableViewScrollPositionMiddle];
}

-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.Book chapterCount];
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{
    CGRect  headerFrame = CGRectMake(0, 0, 320, 30);

    UIView *headerView = [[[UIView alloc] initWithFrame:headerFrame] autorelease];

    UILabel *headerLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 30, headerView.frame.size.height)];
    UILabel *headerLabel2 = [[UILabel alloc] initWithFrame:CGRectMake(headerView.frame.size.width - 30, 0, 30, headerView.frame.size.height)];

    CGRect  frame = CGRectMake(40, 0, 240, 30);

    slider = [[UISlider alloc] initWithFrame:frame];
    slider.minimumValue = 1.0;
    slider.maximumValue = [self.Book chapterCount];
    slider.continuous = YES;
    slider.value = self.Chapter;

    [slider addTarget:self
               action:@selector(updateLabel:)
     forControlEvents:UIControlEventValueChanged];

    [headerView addSubview: slider];

    headerView.backgroundColor    = [UIColor lightGrayColor];

    UIFont *helvetica   = [UIFont fontWithName:@"Helvetica-Bold" size:14];
    headerLabel1.font   = helvetica;
    headerLabel1.text   = @"1";
    headerLabel1.textColor      = [UIColor blackColor];
    headerLabel1.textAlignment  = UITextAlignmentRight;

    headerLabel1.opaque          = TRUE;
    headerLabel1.backgroundColor = [UIColor lightGrayColor];

    [headerView addSubview:headerLabel1];
    [headerLabel1 release];

    headerLabel2.font   = helvetica;
    headerLabel2.text   = [NSString stringWithFormat:@"%d", [self.Book chapterCount]];
    headerLabel2.textColor      = [UIColor blackColor];
    headerLabel2.textAlignment  = UITextAlignmentLeft;

    headerLabel2.opaque          = TRUE;
    headerLabel2.backgroundColor = [UIColor lightGrayColor];

    [headerView addSubview:headerLabel2];
    [headerLabel2 release];

    return headerView;
}

-(float)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 
{
    return 30.0;
}

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *myCellID   = @"MyCellIdentifier";

    UITableViewCell *cell   = [tableView dequeueReusableCellWithIdentifier:myCellID];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:myCellID] autorelease];
    }

    cell.backgroundColor    = [UIColor whiteColor];

    UIFont *helvetica       = [UIFont fontWithName:@"Helvetica-Bold" size:14];
    cell.textLabel.font     = helvetica;
    cell.textLabel.text     = [NSString stringWithFormat:@"Chapter %d", indexPath.row + 1];

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    [contentView changeCurrentChapter:(indexPath.row + 1)];

    [self.view removeFromSuperview];
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view from its nib.

    navBar.topItem.title    = [NSString stringWithFormat:@"%@ %d", self.Book.name, self.Chapter];
    chapterList.delegate    = self;

    [chapterList selectRowAtIndexPath:[NSIndexPath indexPathForRow:(self.Chapter - 1) inSection:0] animated:NO scrollPosition:UITableViewScrollPositionMiddle];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

It appears that the "touch" on the slider is being stopped when the table view recenters the selected item.

Any thoughts, workarounds, etc?

After spending way too long on this one, I ended up running it on an actual device. It worked fine...the hiccup did NOT occur.

This is one bug that only occurs on the simulator. Therefore, it's now a non-issue.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM