2013-08-20 4 views
0

Я пытаюсь загрузить изображение профиля для приложения, но хочу добавить к нему белую рамку и сделать его круговым, прежде чем я его покажу. Чтобы сделать это, я установил свойство изображения в UIImageView, а затем подготовлю изображение, установив соответствующий радиус угла, замаскировав его до границ, а затем добавив дополнительный подуровень границы. Первоначально я загружал изображение через Интернет асинхронно, и все работало нормально, потому что изображение появилось после появления представления. Тем не менее, когда я кэшировал изображение и пытался его подготовить до того, как изображение было отображено на экране, я не смог отобразить пограничный подуровень. Он по-прежнему замаскирован должным образом, просто нет границы. Код, который я использую для подготовки изображения, приведен ниже.Подкласс не отображается, если только после добавленияDIDAppear

- (void)prepareProfileImage 
{ 
    CALayer *imageLayer = self.profileImageView.layer; 
    imageLayer.borderColor = [UIColor whiteColor].CGColor; 
    imageLayer.allowsEdgeAntialiasing = NO; 
    [imageLayer setCornerRadius:PROFILE_IMAGE_DIAMETER/2.0]; 
    [imageLayer setMasksToBounds:YES]; 

    CALayer *borderLayer = [CALayer layer]; 
    CGRect borderFrame = CGRectMake(-1.0, -1.0, (self.profileImageView.frame.size.width+2.0), (self.profileImageView.frame.size.height+2.0)); 
    [borderLayer setBackgroundColor:[[UIColor whiteColor] CGColor]]; 
    [borderLayer setFrame:borderFrame]; 
    [borderLayer setCornerRadius:PROFILE_IMAGE_DIAMETER/2.0]; 
    [borderLayer setBorderWidth:PROFILE_IMAGE_BORDER_WIDTH+1.0]; 
    [borderLayer setBorderColor:[UIColor whiteColor].CGColor]; 

    [imageLayer addSublayer:borderLayer]; 
} 

Этот метод отлично работает до тех пор, как это называется после viewDidLoad, но не добавит пограничный слой, если вызывается перед viewDidLoad. Я подтвердил, что self.profileImageView был выделен во время вызова этого метода, но я получаю только круговой образ, без границы.

Есть ли что-то, что я не понимаю о CALayers? Должно ли это иметь значение, когда я добавляю слой в качестве подслоя?

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

ответ

1

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

я в конечном итоге делает:

/*! This function adds a border layer to the profile image view. */ 
- (void)addBorderLayerToProfileImageView { 
    CALayer *borderLayer = [CALayer layer]; 
    CGRect borderFrame = CGRectMake(-1.0, -1.0, (PROFILE_IMAGE_DIAMETER+2.0), (PROFILE_IMAGE_DIAMETER+2.0)); 
    [borderLayer setBackgroundColor:[[UIColor clearColor] CGColor]]; 
    [borderLayer setFrame:borderFrame]; 
    [borderLayer setCornerRadius:PROFILE_IMAGE_DIAMETER/2.0]; 
    [borderLayer setBorderWidth:PROFILE_IMAGE_BORDER_WIDTH+1.0]; 
    [borderLayer setBorderColor:[UIColor whiteColor].CGColor]; 
    [self.profileImageView.layer addSublayer:borderLayer]; 
} 

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

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