2015-06-14 3 views
2

У меня есть этот файл PNG, который я хотел бы использовать в качестве маски для UIView.Swift: Mask Alignment + Auto-Layout Constraints

enter image description here

мнение должно быть:

  • 20 пикселей/точек в с каждой стороны
  • Идеальный квадратный
  • По центру вертикально

Я установил следующие ограничения для достижения этой цели:

enter image description here

Однако, похоже, эти ограничения не очень хорошо сочетаются с масками. Когда эти ограничения и mask собственности установлены, я получаю следующее:

enter image description here

, но я хотел бы вид, чтобы выглядеть так же, как маски выше, за исключением оранжевый (The backgroundColor здесь только для simplicity- позже я добавить подвидов, которые должны быть замаскированы)

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

enter image description here

Вот мой код (viewForLayer это UIView я сделал в раскадровке):

viewForLayer.layer.borderColor = UIColor.redColor().CGColor 
    viewForLayer.layer.borderWidth = 10 

    var mask = CALayer() 
    mask.contents = UIImage(named: "TopBump")!.CGImage 
    mask.frame = CGRect(x: 0, y: 0, width: viewForLayer.bounds.width, height: viewForLayer.bounds.height) 
    mask.position = CGPoint(x: viewForLayer.bounds.width/2, y: viewForLayer.bounds.height/2) 
    viewForLayer.layer.mask = mask 
    viewForLayer.backgroundColor = UIColor.orangeColor() 

Проблема в том, однако, что в настоящее время точка зрения не правильный размер или в правильном положении, он Безразлично «Следуйте правилам выше». «Представление должно быть:». Как я могу корректно работать с mask, а ограничения автомакета установлены одновременно?

+0

Вы уверены, что этот 'viewForLayer' имеет правильный размер? – Kametrixom

+0

Не уверен, что вы имеете в виду под правильным размером, но я устанавливаю ограничения в раскадровке, и когда я запускаю его, не устанавливая свойство 'mask' слоя, это оранжевый квадрат, который занимает то же место, что и при маскировке, за исключением того, что нижний правый угол, который, очевидно, также оранжевый. – 5813

+0

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

ответ

1

Я нашел путь вокруг него. Не уверен, что это лучший способ, но здесь мы идем ...

http://imgur.com/pUIZbNA

Просто убедитесь, что вы измените имя класса UIView в раскадровке инспектора тоже. Видимо, трюк заключается в том, чтобы установить маску для каждого вызова layoutSubviews.

class MaskView : UIView { 

    override func layoutSubviews() { 
    super.layoutSubviews() 
    if let mask = self.layer.mask { 
     mask.frame = self.bounds 
    }   
    } 

} 

class ViewController: UIViewController { 

    @IBOutlet weak var viewForLayer: MaskView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let image = UIImage(named: "TopBump")!.CGImage! 
     let maskLayer = CALayer() 
     maskLayer.contents = image 
     maskLayer.frame = viewForLayer.bounds 
     viewForLayer.layer.mask = maskLayer 
     viewForLayer.backgroundColor = UIColor.orangeColor() 

     // Do any additional setup after loading the view, typically from a nib. 
     viewForLayer.layer.borderColor = UIColor.redColor().CGColor 
     viewForLayer.layer.borderWidth = 10 


    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

} 
+0

Спасибо! Но я получил странную ошибку, которую я опубликовал в нашем чате. – 5813

+0

Я обновил код MaskView, чтобы иметь дело с корпусом BAD_ACCESS. – Laurent

1

Я попробовал это для себя. Минус nitpicking на 'let mask = CALayer()' (это неизменная ссылка на обновляемый объект), изменение ограничений автоопределения встроенного представления показывает, что маска правильно выровнена.

NSLog("\(viewForLayer.bounds.width), \(viewForLayer.bounds.height)") 

возвращает 375,0, 667,0 на экране iPhone 6. Что вы получаете?

+0

Спасибо за быстрый ответ. См. Редактирование, которое я только что сделал. А для «NSLog», на iPhone 6, я получаю: 600.0, 600.0. – 5813

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