Прошло некоторое время с тех пор, как я пытаюсь создать собственное представление, имеющее в правом верхнем углу простой значок.
Пользовательский вид состоит из 3 частей.Значок представления, как создать с полным подходом к автоматическому макету
- В красном есть пользовательский вид сами, который содержит:
- в синего вид контейнера
- в зеленой зрения значка простого
UILabel
Вид контейнера и вид значка - брат.
На данный момент вид контейнера содержит UIImageView
что посмотреть должны соответствовать этим требованиям:
- Полностью автоматическая раскладка подход
- Сделано программным
- пользовательский вид должен быть выровнен только с учетом синей рамы (вид контейнера)
Зачем? представьте, что вам нужно позиционировать этот вид, выровняв верхний край верхнего края другого вида или кнопки, было бы неплохо, если бы учитывался только контент, показанный внутри контейнера?
Здесь вы можете увидеть, как я устанавливаю ограничения. Метка помещается в верхнем правом углу контейнера.
func setUpConstraint() {
var horContraints = [NSLayoutConstraint]()
horContraints.append(NSLayoutConstraint(item: containerView, attribute: .Leading, relatedBy: .Equal, toItem: self, attribute: .Leading, multiplier: 1, constant: 0))
horContraints.append(NSLayoutConstraint(item: containerView, attribute: .Trailing, relatedBy: .Equal, toItem: badge, attribute: .CenterX, multiplier: 1, constant: 0))
horContraints.append(NSLayoutConstraint(item: badge, attribute: .Trailing, relatedBy: .Equal, toItem: self, attribute: .Trailing, multiplier: 1, constant: 0))
var verContraints = [NSLayoutConstraint]()
verContraints.append(NSLayoutConstraint(item: containerView, attribute: .Bottom, relatedBy: .Equal, toItem: self, attribute: .Bottom, multiplier: 1, constant: 0))
verContraints.append(NSLayoutConstraint(item: containerView, attribute: .Top, relatedBy: .Equal, toItem: badge, attribute: .CenterY, multiplier: 1, constant: 0))
verContraints.append(NSLayoutConstraint(item: badge, attribute: .Top, relatedBy: .Equal, toItem: self, attribute: .Top, multiplier: 1, constant: 0))
addConstraints(verContraints + horContraints)
containerView.addConstraint(NSLayoutConstraint(item: containerView, attribute: .Height, relatedBy: .Equal, toItem: containerView, attribute: .Width, multiplier: 1, constant: 0))
}
вид Контейнер имеет также соотношение сторон ограничение, чтобы сохранить квадратный размер.
Как вы можете видеть на картинке, все кажется прекрасным, за исключением того факта, что когда я пытаюсь ограничить пользовательский вид центром его супервизора, он кажется несогласованным, потому что я хочу, чтобы представление было сосредоточено на уважении к вид контейнера (один с изображением). Значок - это своего рода украшение, такое как тень, и я не хочу, чтобы это рассматривалось.
Чтобы выровнять это правильно, я пытаюсь переопределить прямоугольник выравнивания путем добавления врезки, который «вырезать» половину размера этикетки.
override func alignmentRectInsets() -> UIEdgeInsets {
let badgeSize = badge.bounds.size
return UIEdgeInsets(top: badgeSize.height/2, left: 0, bottom: 0, right: badgeSize.width/2)
}
Я пробовал также различные конфигурации, но я никогда не был в состоянии вписаться в нужном положении
Если я пытаюсь использовать другой 2 метод alignmentRectForFrame
и frameForAlignmentRect
(удаление alignmentRectInsets
), они никогда не будут называется.
Вот что я хотел бы получить:
Я создал little sample code
Но я должен признать, что я не совсем понимаю, что вам нужно. Это может помочь, если вы нарисуете картину того, что вы, а не показываете фотографии того, что вы _getting_. – matt
привет, спасибо за ваше предложение, я отредактировал вопрос. Даже если я попытаюсь инвертировать вставку, это, похоже, не сработает. Прямоугольник выравнивания все еще рассматривает метку. Фактически, похоже, что ничего не меняется, кроме кадра пользовательского представления. Я создал образец кода https://dl.dropboxusercontent.com/u/51180713/TestActivateDeactivate.zip – Andrea
Ну, возможно, я просто ненормально плотный, но я до сих пор не понял, в чем проблема. Когда я думаю, что могу понять, что вы хотите сделать, я не понимаю, почему это сложно. Я не понимаю, какие взгляды вы ссылаетесь на все эти имена. Возможно, это помогло бы мне, если бы вы уменьшили всю проблему до очень простого минимального проекта, разместите его на github и проясните, что случилось с полученным интерфейсом. Таким образом, я мог бы просто попытаться отредактировать сам проект. – matt