CALayers не стал измененным на изменении границ своего UIVIEW. Почему?

Я действительно не могу последовать вашему примеру, так как я незнаком с библиотекой rlang, но я думаю, что хорошим примером замыкания в R будет:

bucket <- function() {
    n <- 1
    foo <- function(x) {
        assign("n", n+1, envir = parent.env(environment()))
        n
    }
    foo
}
bar <- bucket()

, потому что bar() является определением в функциональной среде bucket его родительской средой является bucket, и поэтому вы можете перенести туда некоторые данные. Каждый раз, когда вы запускаете его, вы изменяете среду bucket:

bar()
[1] 2
bar()
[1] 3
bar()
[1] 4
97
задан iain 13 March 2014 в 21:38
поделиться

3 ответа

В Вашем пользовательском представлении Вы должны объявить переменную для своего пользовательского слоя, не объявляйте переменную в объеме init. И просто init это однажды время, не пробуйте установленное нулевое значение и reinit


    class CustomView:UIView {
        var customLayer:CALayer = CALayer()

        override func  layoutSubviews() {
            super.layoutSubviews()
    //        guard let _fillColor = self._fillColor else {return}
            initializeLayout()
        }
        private func initializeLayout() { 
            customLayer.removeFromSuperView()
            customLayer.frame = layer.bounds
                   
            layer.insertSubview(at:0)
        }
    }
0
ответ дан 24 November 2019 в 05:25
поделиться

Поскольку CALayer на iPhone не поддерживает менеджеры компоновки, я думаю, вам нужно сделать основной слой вашего представления настраиваемым подклассом CALayer, в котором вы переопределяете layoutSublayers , чтобы установить рамки всех подслоев. Вы также должны переопределить метод вашего представления + layerClass , чтобы вернуть класс вашего нового подкласса CALayer.

25
ответ дан 24 November 2019 в 05:25
поделиться

У меня была такая же проблема. В слое настраиваемого вида я добавил еще два подслоя. Чтобы изменить размер подслоев (каждый раз, когда меняются границы настраиваемого представления), я реализовал метод layoutSubviews моего настраиваемого представления; внутри этого метода я просто обновляю фрейм каждого подслоя, чтобы он соответствовал текущим границам слоя моего подпредставления.

Примерно так:

-(void)layoutSubviews{
   //keep the same origin, just update the width and height
   if(sublayer1!=nil){
      sublayer1.frame = self.layer.bounds;
   }
}
9
ответ дан 24 November 2019 в 05:25
поделиться