границы и рамки: как отобразить часть UIImage - PullRequest
4 голосов
/ 09 декабря 2010

Моя цель проста; Я хочу создать программу, которая отображает UIImage, и при пролистывании снизу вверх отображает другой UIImage. Изображения здесь могут быть счастливым лицом / грустным лицом. Грустное лицо должно быть отправной точкой, счастливое лицо - конечной точкой. При проведении пальцем часть под пальцем должна показывать счастливое лицо.

Пока что я пытался решить эту проблему с помощью свойств рамки и границ UIImageview, которые я использовал для изображения счастливого лица.

То, что делает этот фрагмент кода, неверно, потому что переход начинается в центре экрана, а не внизу. Обратите внимание, что начало как рамки, так и границы находятся в 0,0 ...

Я прочитал множество страниц о фреймах и границах, но не понимаю. Любая помощь приветствуется!

Загрузка изображений вызывается только один раз.

- (void)loadImages {
    sadface = [UIImage imageNamed:@"face-sad.jpg"];
    happyface = [UIImage imageNamed:@"face-happy.jpg"];
    UIImageView *face1view = [[UIImageView alloc]init];
    face1view.image = sadface;
    [self.view addSubview:face1view];

    CGRect frame;
    CGRect contentRect = self.view.frame;
    frame = CGRectMake(0, 0, contentRect.size.width, contentRect.size.height);
    face1view.frame = frame;
    face2view = [[UIImageView alloc]init];
    face2view.layer.masksToBounds = YES;
    face2view.contentMode = UIViewContentModeScaleAspectFill;
    face2view.image = happyface;
    [self.view addSubview:face2view];
    frame = CGRectMake(startpoint.x, 0, contentRect.size.width, contentRect.size.height);
    face2view.frame = frame;
    face2view.clipsToBounds = YES;
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGPoint movepoint = [[touches anyObject] locationInView: self.view];
    NSLog(@"movepoint: %f %f", movepoint.x, movepoint.y);
    face2view.bounds = CGRectMake(0, 0, 320, 480 - movepoint.y);
}

UIImages и UIImageViews правильно расположены в функции dealloc.

Ответы [ 2 ]

2 голосов
/ 10 декабря 2010

Действительно, вы, кажется, не понимаете, что такое рамки и границы.На самом деле они легки.Всегда помните, что любое представление имеет свою собственную систему координат.Свойства рамки, центра и преобразования выражаются в координатах суперпредставления, а границы - в собственной системе координат представления.Если представление не имеет суперпредставления (еще не установлено в иерархию представлений), оно все равно имеет фрейм.В iOS свойство кадра вычисляется из границ представления, центра и преобразования.Вы можете спросить, что означают рамка и центр ада, когда нет суперпредставления.Они используются, когда вы добавляете представление в другое представление, позволяя расположить представление до того, как оно действительно станет видимым.

Наиболее распространенный пример, когда границы представления отличаются от его рамки, это когда он не находится в верхнем левом углу.его суперпредставления: его bounds.origin может быть CGPointZero, а его frame.origin - нет.Другим классическим примером является UIScrollView, который часто модифицирует свой bounds.origin для прокрутки подпредставлений (фактически, изменение начала координат системы координат автоматически перемещает каждое подпредставление, не затрагивая их кадры), в то время как его собственный кадр является постоянным.

Вернуться к вашему коду.Прежде всего, когда у вас уже есть изображения для отображения в представлениях изображений, имеет смысл инициировать представления с их изображениями:

UIImageView *face1view = [[UIImageView alloc] initWithImage: sadface];

, что помогает представлению изображения сразу же изменять свой размер.Не рекомендуется инициализировать представления с -init, потому что это может пропустить важный код в их назначенном инициализаторе, -initWithFrame:.

Поскольку вы добавляете face1view в self.view, вам действительно следует использовать его границы, а неего рамка:

face1view.frame = self.view.bounds;

То же самое относится и к счастливому лицу.Затем в -touchesMoved:… вы должны либо изменить frame face2view, чтобы переместить его в self.view, либо (если self.view не содержит никаких других подпредставлений, кроме граней), изменить bounds self.view.переместить оба лица внутри него вместе.Вместо этого вы делаете что-то странное, например, вертикально растягивает счастливое лицо внутри face2view.Если вы хотите, чтобы счастливое лицо скользило из нижней части self.view, вы должны сначала установить его кадр следующим образом (изначально не видимым):

face2view.frame = CGRectOffset(face2view.frame, 0, CGRectGetHeight(self.view.bounds));

Если вы решили поменять лица, изменив вид изображения 'кадры (в отличие от изменения bounds в self.view), я думаю, вы можете изменить исходные кадры обоих представлений, чтобы печальное лицо выскользнуло вверх, а счастливое лицо проскользнуло внутрь. Альтернативно, еслиВы хотите, чтобы счастливое лицо покрывало грустное:

face2view.frame = face1view.frame;
0 голосов
/ 10 декабря 2010

Кажется, ваша проблема как-то связана с face2view.bounds в touchesMoved. Вы устанавливаете границы этого вида для прямоугольника, x: 0, y: 0, ширина: 320, высота: 480 - y

x = 0 == слева на оси x

y = 0 == верхняя часть по оси y

Таким образом, вы помещаете эту рамку изображения в верхний левый угол и заставляете ее заполнить весь вид. Это не то, что вы хотите. Изображение просто центрируется в этом изображении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...