如何在具有核心图形的 UIView 上绘制?
How to draw on a UIView with core graphics?
我想不通为什么不能在UIView层上绘图。这可能吗?
我正在使用的示例代码:
@implementation Menu
UIView *window;
UIWindow *mainWindow;
CGSize viewwidth;
viewwidth=[[UIScreen mainScreen] bounds].size;
// viewwidth.width or viewwidth.height
//My UIView
window = [[UIView alloc]initWithFrame:CGRectMake(0, 0, viewwidth.width, viewwidth.height)];
window.backgroundColor = [UIColor whiteColor];
window.layer.opacity = 1.0f;
[window setNeedsDisplay];
[mainWindow addSubview: window];
我的绘制方法drawRect:
- (void)drawRect:(CGRect)rect
{
// Drawing code
CGRect rectangle = CGRectMake(0, 0, 320, 100);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 0.0); //this is the transparent color
CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 0.5);
CGContextFillRect(context, rectangle);
CGContextStrokeRect(context, rectangle); //this will draw the border
}
我是不是做错了什么,问题是我的屏幕是空白的吗?
当您创建一个项目并选择使用故事板时,您将在 Interface Builder 中为您的 Main.storyboard
设置一个 ViewController。
iOS 使用 SceneDelegates
的应用程序和不使用 iOS 的应用程序之间存在差异(13.0 之前的 iOS)。但是当应用程序加载时,您选择的 ViewController 将被指定为在您的 Main Window/Scene 中使用。在 AppDelegate.m(iOS 13 之前)或 SceneDelegate.m(从 iOS 13 开始)中,您可以直接访问甚至自己将其分配给 self.window.rootViewController
属性.
对 UIViewController
的继承进行继承,它带有一个基本的 UIView
,可以在 self.view
下使用(在本例中 ViewController.m 内),您可以放置更多子视图属性 和 [self.view addSubview:yourOtherView]
.
-(void)drawRect:(CGRect)rect
是属于UIView
的方法,当view设置为update或layout时会被调用。但重要的是要知道这不是您可以放置绘图代码的唯一方法。 UIView:drawRect
当您不需要重复重绘图形时,可以避免以降低应用消耗的能源影响和工作量。此外,当您能够降低 CGRect 大小以在内部绘制时,工作量也会受到很大影响。
一个词来命名值..当值以它们所属的内容命名时,您的代码会更少混淆。因此,当您的项目变得更加复杂时,将实际上是 UIView 的 属性 “window” 命名会给您带来压力。因此,您创建了一个名为 mainWindow
的本地值,而 window
已经存在。这样做时,您必须自己将 mainWindow 分配给应用程序 UIWindow 才能使其可用。你命名为 window
的 UIView 可能会让你感到困惑,而 _window
或 self.window
已经作为 AppDelegate 或 SceneDelegate 的一部分存在。如上所述,您有一个 UIView 属于您在 Storyboard 或代码中分配的 UIViewController。
您的绘图代码有效。由于您选择追求透明度,因此您可能看不到它。
下面的一些代码可以与您的 ViewController.
进行比较
#import "ViewController.h"
#import "MyGraphicView.h"
@interface ViewController ()
@property (nonatomic) MyGraphicView *graphicView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
_graphicView = [[MyGraphicView alloc] initWithFrame:self.view.frame];
[self.view addSubview:_graphicView];
}
@end
和一个MyGraphicView.h
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface MyGraphicView : UIView
@end
NS_ASSUME_NONNULL_END
和相应的MyGraphicView.h
#import "MyGraphicView.h"
@implementation MyGraphicView
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
// This method is called when a view is first displayed or when an event occurs that invalidates a visible part of the view.
- (void)drawRect:(CGRect)rect {
CGRect rectangle = CGRectMake(0, 0, 320, 100);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 0.0);
CGContextSetRGBStrokeColor(context, 0.0, 1.0, 0.0, 0.5);
CGContextFillRect(context, rectangle);
CGContextStrokeRect(context, rectangle);
}
@end
我想不通为什么不能在UIView层上绘图。这可能吗?
我正在使用的示例代码:
@implementation Menu
UIView *window;
UIWindow *mainWindow;
CGSize viewwidth;
viewwidth=[[UIScreen mainScreen] bounds].size;
// viewwidth.width or viewwidth.height
//My UIView
window = [[UIView alloc]initWithFrame:CGRectMake(0, 0, viewwidth.width, viewwidth.height)];
window.backgroundColor = [UIColor whiteColor];
window.layer.opacity = 1.0f;
[window setNeedsDisplay];
[mainWindow addSubview: window];
我的绘制方法drawRect:
- (void)drawRect:(CGRect)rect
{
// Drawing code
CGRect rectangle = CGRectMake(0, 0, 320, 100);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 0.0); //this is the transparent color
CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 0.5);
CGContextFillRect(context, rectangle);
CGContextStrokeRect(context, rectangle); //this will draw the border
}
我是不是做错了什么,问题是我的屏幕是空白的吗?
当您创建一个项目并选择使用故事板时,您将在 Interface Builder 中为您的 Main.storyboard
设置一个 ViewController。
iOS 使用 SceneDelegates
的应用程序和不使用 iOS 的应用程序之间存在差异(13.0 之前的 iOS)。但是当应用程序加载时,您选择的 ViewController 将被指定为在您的 Main Window/Scene 中使用。在 AppDelegate.m(iOS 13 之前)或 SceneDelegate.m(从 iOS 13 开始)中,您可以直接访问甚至自己将其分配给 self.window.rootViewController
属性.
对 UIViewController
的继承进行继承,它带有一个基本的 UIView
,可以在 self.view
下使用(在本例中 ViewController.m 内),您可以放置更多子视图属性 和 [self.view addSubview:yourOtherView]
.
-(void)drawRect:(CGRect)rect
是属于UIView
的方法,当view设置为update或layout时会被调用。但重要的是要知道这不是您可以放置绘图代码的唯一方法。 UIView:drawRect
当您不需要重复重绘图形时,可以避免以降低应用消耗的能源影响和工作量。此外,当您能够降低 CGRect 大小以在内部绘制时,工作量也会受到很大影响。
一个词来命名值..当值以它们所属的内容命名时,您的代码会更少混淆。因此,当您的项目变得更加复杂时,将实际上是 UIView 的 属性 “window” 命名会给您带来压力。因此,您创建了一个名为 mainWindow
的本地值,而 window
已经存在。这样做时,您必须自己将 mainWindow 分配给应用程序 UIWindow 才能使其可用。你命名为 window
的 UIView 可能会让你感到困惑,而 _window
或 self.window
已经作为 AppDelegate 或 SceneDelegate 的一部分存在。如上所述,您有一个 UIView 属于您在 Storyboard 或代码中分配的 UIViewController。
您的绘图代码有效。由于您选择追求透明度,因此您可能看不到它。
下面的一些代码可以与您的 ViewController.
进行比较#import "ViewController.h"
#import "MyGraphicView.h"
@interface ViewController ()
@property (nonatomic) MyGraphicView *graphicView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
_graphicView = [[MyGraphicView alloc] initWithFrame:self.view.frame];
[self.view addSubview:_graphicView];
}
@end
和一个MyGraphicView.h
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface MyGraphicView : UIView
@end
NS_ASSUME_NONNULL_END
和相应的MyGraphicView.h
#import "MyGraphicView.h"
@implementation MyGraphicView
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
// This method is called when a view is first displayed or when an event occurs that invalidates a visible part of the view.
- (void)drawRect:(CGRect)rect {
CGRect rectangle = CGRectMake(0, 0, 320, 100);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 0.0);
CGContextSetRGBStrokeColor(context, 0.0, 1.0, 0.0, 0.5);
CGContextFillRect(context, rectangle);
CGContextStrokeRect(context, rectangle);
}
@end