2015-12-17 13 views
4

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

ответ

6

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

Ниже приведен пример, который использует прессованную 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) 
    } 
} 

enter image description here

+2

Привет @joem, как бы один идти о реализации этого для 'UITableView', в том смысле, что я, вероятно, не должен сделать' идентификатор '' для каждого UITableViewCell', но хотелось бы показать некоторые округленные виды (например. как Apple делает в приложении сообщений; 3D Прикосновение к аватару) – brechtb

-2

Прежде всего SourceView должны иметь cornerRadius на своем слое, на самом деле эффект размытия будет иметь радиус угла только если у слоя sourceView есть один. Поскольку sourceView является readonly, он должен быть установлен, когда регистрация выполняется с помощью метода 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"); 

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

  • Нет связанных вопросов^_^