核心邏輯
- 用
BOOL isShow 記錄當前狀態
- 點擊按鈕切換旗標,計算目標 X 座標
UIView animateWithDuration 執行位移動畫
完整實現
// 成員變數
BOOL isShow;
UITableView *sideMenu;
CGFloat hiddenX, visibleX;
- (void)viewDidLoad {
[super viewDidLoad];
isShow = NO;
hiddenX = 1060; // 螢幕外
visibleX = 960; // 顯示位置
sideMenu = [[UITableView alloc] initWithFrame:CGRectMake(hiddenX, 88, 63, 661)];
sideMenu.backgroundColor = [UIColor redColor];
[self.view addSubview:sideMenu]; // 一次性加入視圖層級
}
- (IBAction)menuTouched {
CGFloat targetX = isShow ? hiddenX : visibleX;
[UIView animateWithDuration:1.25 animations:^{
CGRect frame = sideMenu.frame;
frame.origin.x = targetX;
sideMenu.frame = frame;
}];
isShow = !isShow; // 切換狀態
}
關鍵優化
- 不要在點擊事件中重複 alloc/init 視圖,只在
viewDidLoad 建立一次
- 動畫只修改
frame.origin.x,保持其他屬性不變
- 若選單需隨內容高度調整,動畫完成後再
sizeToFit
Swift 版本
var isShow = false
let sideMenu = UITableView(frame: CGRect(x: 1060, y: 88, width: 63, height: 661))
@IBAction func menuTouched() {
let targetX = isShow ? 1060 : 960
UIView.animate(withDuration: 1.25) {
self.sideMenu.frame.origin.x = targetX
}
isShow.toggle()
}