// corner radius
blueView.layer.cornerRadius = 10
// border
blueView.layer.borderWidth = 1.0
blueView.layer.borderColor = UIColor.black.cgColor
// shadow
blueView.layer.shadowColor = UIColor.black.cgColor
blueView.layer.shadowOffset = CGSize(width: 3, height: 3)
blueView.layer.shadowOpacity = 0.7
blueView.layer.shadowRadius = 4.0
Что делать, если есть подслои или подпункты (например, изображение), содержимое которых мы хотим скопировать в рамки нашего представления?
Мы можем выполнить это с помощью
blueView.layer.masksToBounds = true
(альтернативно blueView.clipsToBounds = true
дает тот же результат .)
Но, oh no! Тень также была обрезана, потому что она находится за пределами границ! Что делать? Что делать?
Решение
Используйте отдельные виды для тени и границы. Основной вид прозрачен и имеет тень.
// add the shadow to the base view
baseView.backgroundColor = UIColor.clear
baseView.layer.shadowColor = UIColor.black.cgColor
baseView.layer.shadowOffset = CGSize(width: 3, height: 3)
baseView.layer.shadowOpacity = 0.7
baseView.layer.shadowRadius = 4.0
// add the border to subview
let borderView = UIView()
borderView.frame = baseView.bounds
borderView.layer.cornerRadius = 10
borderView.layer.borderColor = UIColor.black.cgColor
borderView.layer.borderWidth = 1.0
borderView.layer.masksToBounds = true
baseView.addSubview(borderView)
// add any other subcontent that you want clipped
let otherSubContent = UIImageView()
otherSubContent.image = UIImage(named: "lion")
otherSubContent.frame = borderView.bounds
borderView.addSubview(otherSubContent)
Это дает следующий результат:
Добавление закругленных углов и теней может стать хитом производительности. Вы можете повысить производительность, используя предопределенный путь для тени, а также указав, что он растеризован. Следующий код можно добавить к приведенному выше примеру.
baseView.layer.shadowPath = UIBezierPath(roundedRect: baseView.bounds, cornerRadius: 10).cgPath
baseView.layer.shouldRasterize = true
baseView.layer.rasterizationScale = UIScreen.main.scale
Подробнее см. в этом сообщении . Здесь здесь и здесь .
Этот ответ был протестирован с помощью Swift 4 и Xcode 9.
Прямо сейчас вы пытаетесь создать стиль при каждом нажатии кнопки, и это является причиной проблемы.
Вместо этого просто переместите создание темы в глобальное пространство имен, где его можно создать один раз, и это больше не будет проблемой.
import tkinter as tk
import tkinter.ttk as ttk
def test2():
rt1 = tk.Toplevel()
rt1.geometry("500x500")
notebook = ttk.Notebook(rt1)
f1 = tk.Frame(notebook, width=200, height=200)
f2 = tk.Frame(notebook, width=200, height=200)
notebook.add(f1, text="tab 1")
notebook.add(f2, text="tab 2")
notebook.grid(row=0, column=0, sticky="nw")
root = tk.Tk()
root.geometry("500x500")
tree = ttk.Treeview(root, column=("col1", "col2"))
tree.insert("", tk.END, values=("deee", "fjfj","fjjf", "jfjfjf"))
tree.pack()
s = ttk.Style()
s.theme_create("MyStyle", parent="alt", settings={
"TNotebook": {"configure": {"tabmargins": [2, 5, 2, 0]}},
"TNotebook.Tab": {"configure": {"padding": [50, 8] }}})
s.theme_use("MyStyle")
b3 = tk.Button(root, text="new", command=test2)
b3.place(x=200, y=200)
root.mainloop()