当视图被选中时,我正在尝试使用幻灯片来为NSTabView的每个视图设置动画。我让它在某种程度上工作,但它只在我第一次选择一个新的选项卡视图时才有动画效果。之后,我在切换选项卡视图时看不到动画,尽管我可以看到每次都会触发该函数。
override func tabView(tabView: NSTabView, didSelectTabViewItem tabViewItem: NSTabViewItem) {
tabViewItem.view!.setFrameOrigin(NSPoint(x: tabViewItem.view!.frame.origin.x + 300, y: tabViewItem.view!.frame.origin.y))
tabViewItem.view!.animator().setFrameOrigin(NSPoint(x: tabViewItem.view!.frame.origin.x - 300, y: tabViewItem.view!.frame.origin.y))
// i can see this fires every time i switch tab views but the animation only works the fist time
}发布于 2017-01-01 21:12:40
为了解决第一次遇到的问题,我做了一点改动。只需在委托中定义一个整数来存储先前的制表符索引。
- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem{
CABasicAnimation *controlPosAnim = [CABasicAnimation animationWithKeyPath:@"position"];
if (prevTabViewIndex>[tabView indexOfTabViewItem:tabViewItem]) {
[controlPosAnim setFromValue:[NSValue valueWithPoint:CGPointMake(tabViewItem.view.frame.origin.x - 500,tabViewItem.view.frame.origin.y)]];
} else {
[controlPosAnim setFromValue:[NSValue valueWithPoint:CGPointMake(tabViewItem.view.frame.origin.x + 500,tabViewItem.view.frame.origin.y)]];
}
[controlPosAnim setToValue:[NSValue valueWithPoint:CGPointMake(tabViewItem.view.frame.origin.x,tabViewItem.view.frame.origin.y)]];
[[tabViewItem.view layer] addAnimation:controlPosAnim forKey:@"controlViewPosition"];
[tabViewItem.view setAnimations:[NSDictionary dictionaryWithObjectsAndKeys:controlPosAnim, @"frameOrigin", nil]];
[tabViewItem.view.animator setFrameOrigin : CGPointMake(tabViewItem.view.frame.origin.x,tabViewItem.view.frame.origin.y)];
prevTabViewIndex = [tabView indexOfTabViewItem:tabViewItem];
}发布于 2020-04-29 18:30:15
您必须确保NSTabView项是分层支持的,因此一旦(例如,在windowDidLoad()中调用以下代码:
for tabViewItem in self.tabView.tabViewItems {
if let tabViewItemView = tabViewItem.view {
tabViewItemView.wantsLayer = true
}
}这是我对muharrem关于Swift的答案的更新版本,带有正确的动画偏移量:
private var previousTabViewIndex: Int = 0
public func tabView(_ tabView: NSTabView, didSelect tabViewItem: NSTabViewItem?) {
guard let tabViewItem = tabViewItem,
let tabViewItemView = tabViewItem.view,
let tabViewItemLayer = tabViewItemView.layer else { return }
let animation = CABasicAnimation(keyPath: #keyPath(CALayer.position))
let tabViewIndex = tabView.indexOfTabViewItem(tabViewItem)
let origin = CGPoint(x: tabViewItemView.frame.origin.x, y: tabViewItemView.frame.origin.y)
var offsetX = self.tabView.frame.width
if self.previousTabViewIndex > tabViewIndex {
offsetX *= -1
}
animation.fromValue = NSValue(point: CGPoint(x: origin.x + offsetX, y: origin.y))
animation.toValue = NSValue(point: origin)
tabViewItemLayer.add(animation, forKey: "controlViewPosition")
self.previousTabViewIndex = tabViewIndex
}发布于 2021-10-27 22:23:14
如果您使用的是NSTabViewController。只需在viewDidLoad方法内部设置transitionOptions即可。
class TabVC: NSTabViewController {
override func viewDidLoad() {
super.viewDidLoad()
/// When new tab will select, it will perform slide transition.
self.transitionOptions = .slideRight
}
}https://stackoverflow.com/questions/27014330
复制相似问题