2016-05-02 2 views
0

Я использую ios 9 sdk. Я создал этот вид настройки иерархии с autoloayout:Преобразование UIView, автозапуск и точка привязки

----- Top 
    | 30 
----- CustomView (A) 
    | 
    | 
----- 
    | 0 
----- Bot 

Я пытаюсь создать второй CustomView (назовем его B) за первый (назовем его A), масштабируемого на 80% в обоих направлениях, и выше на 5 очков. Таким образом, видна только верхняя часть B.

Это должно быть легко, но это не так. Применяя перевод -5 пунктов и масштабирование .8 на B перемещается B вниз, а не вверх, потому что автоопределение, кажется, использует опорную точку (установленную по умолчанию по умолчанию) в позицию B: кажется, что она обнаруживает, что масштабирование было применено и новички B вертикально - перемещение вниз.

Изменение точки привязки на (x = 0,5, y = 1) перемещает A и B на половину их размера, я не понимаю, почему. Поэтому проблема не устраняется.

Любая идея?

Edit: некоторый код

var card = new CardView(); 
InsertSubview(card, 0); 

card.TranslatesAutoresizingMaskIntoConstraints = false; 
this.AddConstraints(
      card.AtTopOf(this, 30), 
      card.WithSameWidth(this).WithMultiplier(.95f), 
      card.WithSameCenterX(this), 
      card.AtBottomOf(this) 
      ); 

var transform = CGAffineTransform.MakeTranslation(0, -10); 
transform.Scale(.8f,.8f); 
Transform = transform; 

Результат: карта не 20pts сверху, это примерно 50pts, кроме своего первоначального положения 30pt.

+0

Не получая ваш вопрос правильно! что вы хотите точно? – Lion

+1

Укажите код, используемый для создания и добавления представлений. Вероятно, у вас есть правильный диагноз, например. опорная точка является средней, поэтому масштабирование сокращается в «неправильном» направлении, но трудно предложить исправление, не видя, что вы делаете. – jrturton

+0

Код использует Xamarin, на C#, поэтому он не читается всеми. – Softlion

ответ

1

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

Следующий код в детской площадки дает результаты, которые вы хотите:

import UIKit 
import XCPlayground 

let view = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 400, height:400))) 
view.backgroundColor = UIColor.whiteColor() 
XCPlaygroundPage.currentPage.liveView = view 

let a = UIView() 
a.translatesAutoresizingMaskIntoConstraints = false 
a.backgroundColor = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 0.5) 
view.addSubview(a) 
a.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 30).active = true 
a.widthAnchor.constraintEqualToAnchor(view.widthAnchor).active = true 
a.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor).active = true 

let b = UIView() 
b.translatesAutoresizingMaskIntoConstraints = false 
b.backgroundColor = UIColor(red: 0, green: 1, blue: 0, alpha: 1) 
b.layer.anchorPoint = CGPoint(x: 0.5, y: 0) 
view.addSubview(b) 
view.sendSubviewToBack(b) 
NSLayoutConstraint.activateConstraints([ 
    b.centerYAnchor.constraintEqualToAnchor(a.topAnchor), 
    b.widthAnchor.constraintEqualToAnchor(a.widthAnchor), 
    b.heightAnchor.constraintEqualToAnchor(a.heightAnchor), 
    b.centerXAnchor.constraintEqualToAnchor(a.centerXAnchor) 
]) 
let translate = CGAffineTransformMakeTranslation(0.0, -10) 
let scale = CGAffineTransformMakeScale(0.8, 0.8) 
b.transform = CGAffineTransformConcat(translate, scale) 

Результаты:

enter image description here

+0

Я не понимаю, почему он работает, но он работает. Любое реальное объяснение? Большое вам спасибо ... Я потерял 2 дня на этом, был в отчаянии и готов удалить автозапуск. – Softlion

+0

Как я уже сказал, это взаимодействие между опорными точками и автоспуск - это всегда было немного ужасно (см. Http://stackoverflow.com/questions/12943107/how-do-adjust-the-anchor-point-of-a -calayer-when-auto-layout-is-being-used), но в вашем случае вы перемещаете опорную точку от центра вверх, что компенсирует кадр на 50% от высоты, поэтому привязка центра к сверху вместо двух вершин вместе отменяет это. – jrturton

+0

В вопросе, на который вы ссылаетесь, в обновленном сообщении в блоге написано, что привязка и преобразования не используются автозапуском больше с ios8. Кажется, это неверно. Или я не понимаю пост в блоге. – Softlion

0

два возможных подхода я вижу, являются:
- масштаб, а затем добавить его в иерархии представлений
или
- изменить anchorpoint из вида B, прежде чем добавить его в иерархии представлений. Затем вы можете преобразовать его так, как хотите.

+0

Я не могу масштабировать сначала, так как этот масштаб будет изменен с помощью анимации. Я попробовал вам второе предложение, и оно не работает: вертикальная середина A (и B тоже) перемещается в верхней части экрана. Wtf с автозапуском? – Softlion

+0

Каждый вид имеет точку зрения. изменение только вида B должно сделать трюк. Если вид A не является подсмотром вида B - в этом случае A будет двигаться с B со своей его части. Также, если есть тесная связь через Autolayout. Нужно будет посмотреть на свойства. Там несколько подводных камней. –

+0

View A и B - это 2 экземпляра одного класса. Если я рассматриваю только вид B, то центр обзора B перемещается в верхней части главного экрана. – Softlion

Смежные вопросы