self.edgesForExtendedLayout = UIRectEdgeBottom讲解

iOS7之前的版本中UIViewController中的view在显示后会自动调整为去掉导航栏的高度的。这样我们摆放控件的时候就会在导航栏的下面显示。但是在iOS7中UIViewController的wantsFullScreenLayout已经被舍弃了,不再提供此属性,所有的UIViewController创建后默认就是full Screen的,因此如果带导航栏的应用界面中的部分控件会被导航栏覆盖掉。
    要解决这中情况可以使用iOS7中UIViewController新增的属性
extendedLayoutIncludesOpaqueBars和edgesForExtendedLayout来解决。其中这个属性指定了当Bar使用了不透明图片时,视图是否延伸至Bar所在区域,默认值时NO。而edgesForExtendedLayout则是表示视图是否覆盖到四周的区域,默认是UIRectEdgeAll,即上下左右四个方向都会覆盖,那么为让顶部不进行延伸到导航栏覆盖的区域,我们可以把顶部区域延伸去掉。实现代码如下:

self.extendedLayoutIncludesOpaqueBars = NO;
self.edgesForExtendedLayout = UIRectEdgeBottom | UIRectEdgeLeft | UIRectEdgeRight;
 
 
要实现拖拽功能,你需要将canvas绑定鼠标按下、移动、释放事件,并在事件处理函数中实现拖拽逻辑。具体步骤如下: 1. 在初始化函数中添加以下代码,将canvas绑定鼠标事件: ``` self.canvas.mpl_connect('button_press_event', self.on_press) self.canvas.mpl_connect('motion_notify_event', self.on_motion) self.canvas.mpl_connect('button_release_event', self.on_release) ``` 2. 实现事件处理函数。在on_press函数中获取鼠标按下时的位置,并记录下当前图像的偏移量。在on_motion函数中计算出鼠标移动的距离,并将图像的偏移量加上这个距离,更新图像的位置。在on_release函数中清空记录的偏移量。 ``` def on_press(self, event): if event.button == 1: self.press = (event.x, event.y) self.offset = self.figure.transFigure.transform(self.figure.transData.inverted().transform((event.x, event.y))) def on_motion(self, event): if self.press is not None: dx = event.x - self.press[0] dy = event.y - self.press[1] self.offset += (dx / self.canvas.get_width_height()[0], dy / self.canvas.get_width_height()[1]) self.figure.subplots_adjust(left=self.offset[0], bottom=self.offset[1], right=1 - self.offset[0], top=1 - self.offset[1]) self.canvas.draw() def on_release(self, event): if event.button == 1: self.press = None ``` 注意,这里的偏移量是指图像在画布中的位置偏移量,需要通过Figure对象的transFigure和transData属性进行转换。同时,在每次更新图像位置后,需要调用canvas的draw方法重新绘制画布。 完整的代码如下所示: ``` from matplotlib.figure import Figure from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget class MainWindow(QMainWindow): def __init__(self): super().__init__() self.figure = Figure() self.canvas = FigureCanvas(self.figure) self.press = None self.offset = (0, 0) self.init_ui() def init_ui(self): widget = QWidget() layout = QVBoxLayout(widget) layout.addWidget(self.canvas) self.setCentralWidget(widget) self.canvas.mpl_connect('button_press_event', self.on_press) self.canvas.mpl_connect('motion_notify_event', self.on_motion) self.canvas.mpl_connect('button_release_event', self.on_release) def on_press(self, event): if event.button == 1: self.press = (event.x, event.y) self.offset = self.figure.transFigure.transform(self.figure.transData.inverted().transform((event.x, event.y))) def on_motion(self, event): if self.press is not None: dx = event.x - self.press[0] dy = event.y - self.press[1] self.offset += (dx / self.canvas.get_width_height()[0], dy / self.canvas.get_width_height()[1]) self.figure.subplots_adjust(left=self.offset[0], bottom=self.offset[1], right=1 - self.offset[0], top=1 - self.offset[1]) self.canvas.draw() def on_release(self, event): if event.button == 1: self.press = None if __name__ == '__main__': app = QApplication([]) window = MainWindow() window.show() app.exec_() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值