Как обрезать часть изображения за пределами ячейки collectionview в swift

#ios #swift #uiimageview #collectionview

#iOS #swift #uiimageview #collectionview

Вопрос:

У меня есть простое приложение для дизайна, где у меня есть только круглое изображение в правом верхнем углу. Я пытаюсь сделать что-то вроде того, что у них есть в приложении bloom.

введите описание изображения здесь

Посмотрите, как край изображения обрезается по краю ячейки, я пытаюсь сделать что-то подобное, но я продолжаю получать это.

введите описание изображения здесь

У меня было ощущение, что вся ячейка — это просто изображение, чтобы оно выглядело так, но я не знаю, хочу ли я создать изображение всей ячейки, поскольку я планирую в конечном итоге иметь возможность изменять цвет ячейки и цвет изображения круга в разное время и использовать разные цвета, поэтому не в моих интересах использовать только большое изображение для ячейки, поскольку я могу захотеть использовать и другие изображения. Также кажется, что разобраться в этом проще, чем просто создать пару десятков разных изображений, что также увеличивает размер приложения.

Я просмотрел несколько разных сообщений, но ни одно из них, похоже, не работает для меня.

Я пытался:

  • установка рамки изображения и фона в границы
  • используя все различные режимы содержимого
  • используя clipsToBound и masksToBounds и установив для них значения true и false.

это то, что находится в моей ячейке:

     contentView.addSubview(cellBackgrounded)
        cellBackgrounded.addSubview(imgView)
//        imgView.frame = cellBackgrounded.bounds  set this to = self.bounds, contentView.frame
//        contentView.frame = self.bounds
//        cellBackgrounded.frame = self.bounds
//        imgView.layer.masksToBounds = false
        imgView.translatesAutoresizingMaskIntoConstraints = false
        imgView.image = UIImage(named: "Oval")?.withRenderingMode(.alwaysTemplate)
        imgView.clipsToBounds = true
        imgView.contentMode = .scaleToFill
        imgView.tintColor = .red
        
        cellBackgrounded.translatesAutoresizingMaskIntoConstraints = false
        cellBackgrounded.backgroundColor = .white
        cellBackgrounded.addSubview(cellName)
        cellName.translatesAutoresizingMaskIntoConstraints = false
        cellName.font = UIFontMetrics.default.scaledFont(for: UIFont.systemFont(ofSize: 50, weight: .bold))
        cellName.textColor = .black
        cellName.numberOfLines = 0
        cellName.textAlignment = .center
        
        darkShadow.frame = self.bounds
        darkShadow.cornerRadius = 15
        darkShadow.backgroundColor = UIColor.offWhite.cgColor
        darkShadow.shadowColor = UIColor.black.withAlphaComponent(0.2).cgColor
        darkShadow.shadowOffset = CGSize(width: 10, height: 10)
        darkShadow.shadowOpacity = 1
        darkShadow.shadowRadius = 15
        self.layer.insertSublayer(darkShadow, at: 0)
        
        NSLayoutConstraint.activate([
            cellBackgrounded.topAnchor.constraint(equalTo: topAnchor),
            cellBackgrounded.leadingAnchor.constraint(equalTo: leadingAnchor),
            cellBackgrounded.trailingAnchor.constraint(equalTo: trailingAnchor),
            cellBackgrounded.bottomAnchor.constraint(equalTo: bottomAnchor),
            imgView.topAnchor.constraint(equalTo: cellBackgrounded.topAnchor, constant: -40),
            imgView.trailingAnchor.constraint(equalTo: cellBackgrounded.trailingAnchor, constant: 40),
            cellName.centerXAnchor.constraint(equalTo: cellBackgrounded.centerXAnchor),
            cellName.centerYAnchor.constraint(equalTo: cellBackgrounded.centerYAnchor),
            cellName.leadingAnchor.constraint(equalTo: cellBackgrounded.leadingAnchor, constant: 10),
            cellName.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10),
            imgView.heightAnchor.constraint(equalTo: cellBackgrounded.heightAnchor, multiplier: 0.7),
            imgView.widthAnchor.constraint(equalTo: cellBackgrounded.widthAnchor, multiplier: 0.7)
        ])
  

если есть что-то еще, с чем я могу помочь, пожалуйста, спросите,
Спасибо

Комментарии:

1. Для какого вида вы установили clipsToBound ?

2. вы должны вызвать clipsToBound представление контейнера вместо представления, которое вы хотите обрезать

3. @CongNguyen да, это сработало. Кажется, я не понял, что такое clipsToBounds. Извините за хлопоты, спасибо

Ответ №1:

Используйте ClipToBounds

Согласно документам Apple :

Когда значение этого свойства равно true, Core Animation создает неявную обтравочную маску, которая соответствует границам слоя и включает любые эффекты углового радиуса

Для решения этой проблемы необходимо выполнить привязку клипов к просмотру контейнера

 containerView.clipsToBound = true