加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 在全屏模式下连接到NSView的NSView上的NSControl

发布时间:2020-12-16 06:57:16 所属栏目:百科 来源:网络整理
导读:设置: 我的应用程序具有使用enterFullScreenMode:withOptions:设置为全屏模式的后台视图. 对于这些背景视图,我使用removeFromSuperview和addSubview:将内容视图作为子视图移动. 此外,还有一个首选项视图,我将其添加到内容视图中,如前所述. 首选项视图来
设置:

>我的应用程序具有使用enterFullScreenMode:withOptions:设置为全屏模式的后台视图.
>对于这些背景视图,我使用removeFromSuperview和addSubview:将内容视图作为子视图移动.
>此外,还有一个首选项视图,我将其添加到内容视图中,如前所述.
首选项视图来自XIB并包含NSControls,如复选框,圆形幻灯片,组合框,…

整个设置要复杂得多,这使得在此处发布代码变得非常困难.不过,如果您要求,我会添加一些部分.

问题:
当我选择首选项视图中的任何控件时,元素会闪烁.这意味着示例复选框消失并重新出现.
我已经尝试在视图的viewDidMoveToSuperview方法中解决运行setNeedsDisplay:,setNeedsLayout或makeKeyAndOrderFront的问题.虽然,没有任何帮助.我能做什么?

编辑1:
我拿了一个screen capture的应用程序,你可以看到会发生什么.

编辑2:
这是PreferencesViewController.h:

//  PreferencesViewController.h

#import <Cocoa/Cocoa.h>
#import "SlideShowModelProtocol.h"
#import "DisplayInfoController.h"

@interface PreferencesViewController : NSViewController {
    id<SlideShowModelProtocol> m_localModel;
    DisplayInfoController* m_displayInfoController;
}

@property (readonly) id<SlideShowModelProtocol> localModel;
@property (readwrite,assign) IBOutlet DisplayInfoController* displayInfoController;

- (void)moveViewToSuperview:(NSView*)superview;
- (void)showOnView:(NSView*)superview;
- (void)removeViewFromSuperview;
- (BOOL)viewHasSuperview;
- (void)updateModelSettings;
- (IBAction)cancelView:(id)sender;
- (IBAction)confirmView:(id)sender;

@end

…和实现PreferencesViewController.m:

//  PreferencesViewController.m

#import "PreferencesViewController.h"
#import "ApplicationController.h"
#import "DisplayInfo.h"


@interface PreferencesViewController()

- (void)centerViewOnSuperview;
- (void)loadModel;

@end

@implementation PreferencesViewController


- (id)init {
    self = [super initWithNibName:@"PreferencesView" bundle:nil];
    if (self != nil) {
        m_localModel = nil;
        m_displayInfoController = nil; // Assigned in Interface Builder.
    }
    return self;
}

@synthesize localModel = m_localModel;
@synthesize displayInfoController = m_displayInfoController;

- (void)loadModel {
    [self willChangeValueForKey:@"localModel"];
    // Retrieve deep copy of the model.
    m_localModel = [[[ApplicationController sharedController] model] copyWithZone:nil];
    // Reset the table view selection as saved in the model.
    NSIndexSet* selectionIndices = [NSIndexSet indexSetWithIndex:[[m_localModel selectedScreenIndex] unsignedIntegerValue]];
    [[m_displayInfoController displayInfoTableView] selectRowIndexes:selectionIndices byExtendingSelection:NO];
    [self didChangeValueForKey:@"localModel"];
}

/**
    Moves and positions the view on the given superview (aka another screen).
    @param superview A superview.
 */
- (void)showOnView:(NSView*)superview {
    [self moveViewToSuperview:superview];
    [self centerViewOnSuperview];
}

/**
    Moves the view on the given superview.
    @param superview A superview (In full screen mode a background view).
 */
- (void)moveViewToSuperview:(NSView*)superview {
    if ([[self view] superview] == superview) {
        return;
    }
    [self loadModel];
    [[self view] removeFromSuperview];
    [superview addSubview:[self view]];
}

- (void)removeViewFromSuperview {
    [[self view] removeFromSuperview];
}


- (void)centerViewOnSuperview {
    NSRect superviewFrame = self.view.superview.frame;
    NSRect viewFrame = self.view.frame;
    float viewFrameWidth = viewFrame.size.width;
    float viewFrameHeight = viewFrame.size.height;
    float xPos = 0.5f * superviewFrame.size.width - 0.5f * viewFrameWidth;
    float yPos = 0.5f * superviewFrame.size.height - 0.5f * viewFrameHeight;
    NSRect frame = NSMakeRect(xPos,yPos,viewFrameWidth,viewFrameHeight);
    [self.view setFrame:frame];
}

- (BOOL)viewHasSuperview {
    return [[self view] superview] != nil;
}

- (void)updateModelSettings {
    id<SlideShowModelProtocol> globalModel = [[ApplicationController sharedController] model];
    [globalModel setFadeDuration:[m_localModel fadeDuration]];
    [globalModel setStayDuration:[m_localModel stayDuration]];
    [globalModel setStartWithFirst:[m_localModel startWithFirst]];
    [globalModel setSortingMode:[m_localModel sortingMode]];
    [globalModel setAnimationIsActive:[m_localModel animationIsActive]];
    [globalModel setSelectedScreenIndex:[m_localModel selectedScreenIndex]];
    [globalModel setPanAmount:[m_localModel panAmount]];
    [globalModel setZoomAmount:[m_localModel zoomAmount]];
    [globalModel setZoomFactor:[m_localModel zoomFactor]];
}

#pragma mark -
#pragma mark UserInterface

- (IBAction)cancelView:(id)sender {
    [[ApplicationController sharedController] hidePreferencesViewModelSettingsUpdated:NO];
}

- (IBAction)confirmView:(id)sender {
    ApplicationController* applicationController = [ApplicationController sharedController];
    if ([[applicationController model] isEqualToModel:m_localModel]) {
        [self cancelView:sender];
        return;
    }
    [self updateModelSettings];
    [applicationController hidePreferencesViewModelSettingsUpdated:YES];
}

@end

解决方法

正如我在帖子的评论中所说,我创建了一个新的PreferencesViewTest.xib,并逐步添加了GUI控件.我还添加了绑定,控制器等.一切都很好 – 没有闪烁.然后我将RETURN指定为Interface Builder中OK按钮的等效键.我再次启动应用程序来检查行为….它闪烁!我通过删除OK按钮中的等效键来双重检查前一个PreferencesView.xib的现象……它没有闪烁! – 疯狂的狗屎.但为什么..?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读