В Safari, если вы используете 3D-касание, sourceRect ссылки, которая касается касания, имеет закругленные углы. Когда я устанавливаю исходный прямоугольник в: func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
при предварительном просмотреКонтекст, я могу установить только previewingContext.sourceRect
, который не позволяет обойти углы или установить многоугольную область. Как я могу это сделать?Как я могу обойти углы источникаRect для Peek и Pop 3D Touch?
ответ
Вы можете косвенно устанавливать круглые углы в 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)
}
}
Прежде всего 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");
Привет @joem, как бы один идти о реализации этого для 'UITableView', в том смысле, что я, вероятно, не должен сделать' идентификатор '' для каждого UITableViewCell', но хотелось бы показать некоторые округленные виды (например. как Apple делает в приложении сообщений; 3D Прикосновение к аватару) –
brechtb