gpt4 book ai didi

objective-c - COCOA:如何创建圆形按钮。它应该只能在其边界内点击

转载 作者:行者123 更新时间:2023-12-03 17:48:48 26 4
gpt4 key购买 nike

我正在尝试创建一个只能在其边界内单击的圆形按钮。

我做了什么

// imported QuartzCore
#import <QuartzCore/QuartzCore.h>

//created an IBOutlet for the button
IBOutlet NSButton* btn;

//defined the button height width (same)
#define ROUND_BUTTON_WIDTH_HEIGHT 150

//set corner radius
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application

btn.frame = CGRectMake(0, 0, ROUND_BUTTON_WIDTH_HEIGHT, ROUND_BUTTON_WIDTH_HEIGHT);
btn.layer.cornerRadius = ROUND_BUTTON_WIDTH_HEIGHT/2.0f;
}

//设置 View 层为YES

enter image description here

问题

  1. 该按钮在其边界之外可点击。
  2. 当我设置其位置以及调整窗口大小时,它会回到正确的位置(按钮的实际位置是窗口的中心)

enter image description here

我还尝试对 NSButton 进行子类化并将该类分配给按钮,但结果是相同的。

#import "roundBtn.h"
#import <QuartzCore/QuartzCore.h>

@implementation roundBtn

#define ROUND_BUTTON_WIDTH_HEIGHT 142

- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];

// Drawing code here.


self.frame = CGRectMake(0, 0, ROUND_BUTTON_WIDTH_HEIGHT, ROUND_BUTTON_WIDTH_HEIGHT);
self.layer.cornerRadius = ROUND_BUTTON_WIDTH_HEIGHT/2.0f;
}

@end

最佳答案

您可以使用自定义 NSView 重新实现按钮行为,然后它将尊重 maskToBounds 层的 mouseDown 事件。 NSButton 不会以这种方式工作,因此告诉子类按钮它不会在圆外被击中的唯一方法是重写 -hitTest: 方法来检测圆内的击中:

- (NSView *)hitTest:(NSPoint)aPoint {
NSPoint p = [self convertPoint:aPoint fromView:self.superview];
CGFloat midX = NSMidX(self.bounds);
CGFloat midY = NSMidY(self.bounds);
if (sqrt(pow(p.x-midX, 2) + pow(p.y-midY, 2)) < self.bounds.size.width/2.0) {
return self;
}
return nil;
}

在覆盖这个过程中,你告诉按钮只有在圆圈内时才会记录一次点击(使用一点三角学)。返回 self 表示按钮被点击,返回 nil 表示按钮未被点击。

关于objective-c - COCOA:如何创建圆形按钮。它应该只能在其边界内点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34738605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com