uiscrollview, который загружает подпредставления вместо изображений - PullRequest
0 голосов
/ 12 июня 2011

Я получил этот код из прокрутки примера проекта Apple:

@synthesize scrollView1, scrollView2;

const CGFloat kScrollObjHeight  = 467.0;
const CGFloat kScrollObjWidth   = 320.0;
const NSUInteger kNumImages     = 6;


- (void)layoutScrollImages
{
    UIImageView *view = nil;
    NSArray *subviews = [scrollView1 subviews];


    // reposition all image subviews in a horizontal serial fashion
    CGFloat curXLoc = 0;
    for (view in subviews)
    {
        if ([view isKindOfClass:[UIImageView class]] && view.tag > 0)
        {
            CGRect frame = view.frame;
            frame.origin = CGPointMake(curXLoc, 0);
            view.frame = frame;

            curXLoc += (kScrollObjWidth);
        }
    }

    // set the content size so it can be scrollable
    [scrollView1 setContentSize:CGSizeMake((kNumImages * kScrollObjWidth), [scrollView1 bounds].size.height)];
}

Я пытался изменить это, чтобы загрузить подпредставления вместо изображений, но это не работает.Я думаю, что я каким-то образом заменяю представления вместо того, чтобы добавлять их?Мне нужно загрузить представления из отдельных файлов XIB и прокручивать их влево-вправо (каждый из них содержит панель кнопок, ведущих на разные уровни в моей игре).Так что я делаю не так?Почему это не работает?Он показывает только вторую панель, и всякий раз, когда я нажимаю кнопку, он падает с SIGABRT.

#import "LevelSelectButtons.h"

@implementation LevelSelectButtons
@synthesize levelScroll;

const int kScrollObjHeight = 400;
const int kScrollObjWidth = 320;
const NSUInteger kNumCategories = 5;

- (void)layoutScrollScreens {
    UIImageView *view = nil;
    NSArray *subviews = [levelScroll subviews];

    // reposition all image subviews in a horizontal serial fashion
    CGFloat curXLoc = 0;
    for (view in subviews) {
        if ([view isKindOfClass:[UIImageView class]] && view.tag > 0) {
            CGRect frame = view.frame;
            frame.origin = CGPointMake(curXLoc, 0);
            view.frame = frame;

            curXLoc += (kScrollObjWidth);
        }
    }

    // set the content size so it can be scrollable
    [levelScroll setContentSize:CGSizeMake((kNumCategories * kScrollObjWidth), [levelScroll bounds].size.height)];
}

- (void)viewDidLoad {
    [levelScroll setScrollEnabled:YES];
    CGFloat width = 640; //kScrollObjWidth*kNumCategories;
    CGFloat height = 400;
    [levelScroll setContentSize:CGSizeMake(width, height)];
    [self.view addSubview:levelScroll];
    levelScroll.pagingEnabled = YES;
    levelScroll.indicatorStyle = UIScrollViewIndicatorStyleWhite;

    levelScroll.pagingEnabled = YES;

    /// LEVELS 1 ///
    NSUInteger viewNum = 0;
    CGRect catViewFrame = CGRectMake(0, 0, kScrollObjWidth, kScrollObjHeight);
    UIView *levels1view = [[UIView alloc] initWithFrame:catViewFrame];

    NSArray *array1 = [[NSBundle  mainBundle] loadNibNamed:@"Levels1" owner:self options:nil];
    levels1view = [array1 objectAtIndex:0];
    levels1view.tag = viewNum;

    [self.levelScroll addSubview:levels1view];


    /// LEVELS 2 ///
    viewNum = 1;
    catViewFrame = CGRectMake(320, 0, kScrollObjWidth, kScrollObjHeight);
    UIView *levels2view = [[UIView alloc] initWithFrame:catViewFrame];
    NSArray * array2= [[NSBundle mainBundle] loadNibNamed:@"Levels2" owner:self options:nil];
    levels2view = [array2 objectAtIndex:0];
    levels2view.tag = viewNum;

    [self.levelScroll addSubview:levels2view];

    [self layoutScrollScreens];
    [super viewDidLoad];
}

Это строка, где появляется SIGABRT:

int retVal = UIApplicationMain(argc, argv, nil, nil);

1 Ответ

0 голосов
/ 12 июня 2011

Это объясняет, почему отображается только levels2view.

/// LEVELS 2 ///
viewNum = 1;
catViewFrame = CGRectMake(320, 0, kScrollObjWidth, kScrollObjHeight);
UIView *levels2view = [[UIView alloc] initWithFrame:catViewFrame];

Если вы смотрите здесь, вы создаете новый вид с желаемой рамкой, в которой вы хотите, чтобы ваш levels2view был расположен,Но,

NSArray * array2= [[NSBundle mainBundle] loadNibNamed:@"Levels2" owner:self options:nil];
levels2view = [array2 objectAtIndex:0];
levels2view.tag = viewNum;

[self.levelScroll addSubview:levels2view];

Здесь вы переназначаете переменную на новое представление и таким образом теряете ссылку на созданное вами представление, что приводит к утечке памяти.Кроме этого, у этого представления нет установленного фрейма.По умолчанию это будет исходная точка CGPointZero.И поскольку вы делаете то же самое с levels1view, вы заканчиваете тем, что ставите levels2view поверх levels1view, когда добавляете их в представление прокрутки, когда добавляете их в таком порядке.

viewNum = 1;
catViewFrame = CGRectMake(320, 0, kScrollObjWidth, kScrollObjHeight);

NSArray * array2= [[NSBundle mainBundle] loadNibNamed:@"Levels2" owner:self options:nil];
UIView * levels2view = [array2 objectAtIndex:0];
levels2view.frame = catViewFrame;
levels2view.tag = viewNum;

[self.levelScroll addSubview:levels2view];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...