Как я могу закруглить углы SourceRect для Peek и Pop 3D Touch?

В Safari, если вы используете 3D Touch, sourceRect ссылки, к которой вы прикоснулись, имеют закругленные углы. Когда я устанавливаю исходный прямоугольник в: func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {при предварительном просмотре контекста, я могу только установить previewingContext.sourceRect что не позволяет мне закруглять углы или устанавливать многоугольную область. Как я могу это сделать?

2 ответа

Вы можете косвенно установить закругленные углы для sourceRect, добавив угловой радиус к слою sourceView. Когда вы устанавливаете previewingContext.sourceRect к границам sourceView область, которая остается в фокусе, также будет иметь закругленные углы.

Вот пример, который использует нажимаемую UILabel:

class ViewController: UIViewController {

    var previewingContext: UIViewControllerPreviewing?
    let label = UILabel(frame: CGRectMake(150, 250, 100, 50))

    override func viewDidLoad() {
        super.viewDidLoad()

        let background = UIImageView(frame: view.bounds)
        background.image = UIImage(named: "image.jpg")
        view.addSubview(background)

        label.backgroundColor = UIColor.whiteColor()
        label.text = "Press me!"
        label.textAlignment = .Center
        label.layer.cornerRadius = 20
        label.clipsToBounds = true
        label.userInteractionEnabled = true
        view.addSubview(label)

        previewingContext = registerForPreviewingWithDelegate(self, sourceView: label)
    }
}

extension ViewController: UIViewControllerPreviewingDelegate {

    func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
        previewingContext.sourceRect = label.bounds

        return UIViewController()
    }

    func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {
        showViewController(viewControllerToCommit, sender: self)
    }
}

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

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

В качестве примера в виде коллекции с угловым радиусом в его ячейках, регистрация может быть выполнена в collectionView:cellForItemAtIndexPath:, И для безопасности, и так как previewingContext будет проверен позже, я сохраняю слабый указатель на previewingContext, возвращаемый registerForPreviewingWithDelegate:sourceView: в самой клетке:

if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
    id previewingContext = [self registerForPreviewingWithDelegate:self sourceView:cell];
    cell.weakPreviewingContext = previewingContext;
}

Тогда в методе collectionView:didEndDisplayingCell:forItemAtIndexPath: протокола UICollectionViewDelegate я сделал отмену регистрации следующим образом:

if (collectionView == self.collectionView) {
    if ([cell isKindOfClass:UserInHomeCollectionCell.class]) {
        [self unregisterForPreviewingWithContext:((UserInHomeCollectionCell*)cell).weakPreviewingContext];
    }
}

Наконец-то в методе previewingContext:viewControllerForLocation: протокола UIViewControllerPreviewingDelegate я сделал проверку безопасности следующим образом:

UserInHomeCollectionCell *cell = (UserInHomeCollectionCell*)[(UIViewController*)previewingContext view];
NSAssert([cell isKindOfClass:UserInHomeCollectionCell.class], @"***** INTERNAL ERROR: Invalid class for retrieved cell %@", cell);
NSAssert([previewingContext isEqual:((UserInHomeCollectionCell*)cell).weakPreviewingContext], @"***** INTERNAL ERROR: Invalid Previewing Context");
Другие вопросы по тегам