iOS开发--UIPopoverPresentationController

这个是跟微信的这个功能相似

iOS开发--UIPopoverPresentationController_第1张图片
1

下边是我的测试图片:

iOS开发--UIPopoverPresentationController_第2张图片
2.png

点击+按钮就可以弹出橘色的视图
下边上代码了啊!

  • 首先在你的控制器上添加一个按钮
    然后在你的工程中创建一个要推出的控制器也就是承载橘色视图的控制器
  • 按钮的点击事件代码:
 - (void)buttonClick:(UIButton *)sender
{
    JHViewController * testVC = [JHViewController new];
    // 设置大小
    testVC.preferredContentSize = CGSizeMake(100, 100);
    // 设置 Sytle
    testVC.modalPresentationStyle = UIModalPresentationPopover;
    // 需要通过 sourceView 来判断位置的
    testVC.popoverPresentationController.sourceView = self.button;
    // 指定箭头所指区域的矩形框范围(位置和尺寸),以sourceView的左上角为坐标原点
    // 这个可以 通过 Point 或  Size 调试位置
    testVC.popoverPresentationController.sourceRect = self.button.bounds;
    // 箭头方向
    testVC.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionUp;
    // 设置代理
    testVC.popoverPresentationController.delegate = self;
    [self presentViewController:testVC animated:YES completion:nil];
}
  • UIPopoverPresentationControllerDelegate 的代理
-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller{
    return UIModalPresentationNone; //不适配
}

 - (BOOL)popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController{
    return YES;   //点击蒙版popover消失, 默认YES
}

barButtonItem 的方便:
实际上就是其 API 中另外一个属性:

@property (nullable, nonatomic, strong) UIBarButtonItem *barButtonItem;

如果有navigationController, 并且从right/leftBarButtonItem点击后出现popover, 则可以把 right/leftBarButtonItem看做上面说的sourceView.默认箭头指向up,所以在这种情况下也可以不设置箭头方向。
一个 Bug

[Warning] <_UIPopoverBackgroundVisualEffectView 0x7fafbae14830> is being asked to animate its opacity. 
This will cause the effect to appear broken until opacity returns to 
  • 话说这个问题是系统在执行alpha渐变动画时,UIVisualEffectView创建了裁剪区域外的模糊实例,警告说,他的效果可能会被破坏,然而经过测试没有被破坏。 暂时可以不做处理?
    对于目前我们项目中已经支持 iOS 8 的来说,直接用UIPopoverPresentationController 是很方便的, 而且系统的肯定更好些.

你可能感兴趣的:(iOS开发--UIPopoverPresentationController)